Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing by reference to n-th element in C#

In C, if we have an array, we can pass it by reference to a function. We can also use simple addition of (n-1) to pass the reference starting from n-th element of the array like this:

char *strArr[5];
char *str1 = "I want that!\n";
char *str2 = "I want this!\n";
char *str3 = "I want those!\n";
char *str4 = "I want these!\n";
char *str5 = "I want them!\n";
strArr[0] = str1;
strArr[1] = str2;
strArr[2] = str3;
strArr[3] = str4;
strArr[4] = str5;
printPartially(strArr + 1, 4); //we can pass like this to start printing from 2nd element

....

void printPartially(char** strArrPart, char size){
int i;
for (i = 0; i < size; ++i)
    printf(strArrPart[i]);
}

Resulting in these:

I want this!
I want those!
I want these!
I want them!

Process returned 0 (0x0)   execution time : 0.006 s
Press any key to continue.

In C#, we can also pass reference to an object by ref (or, out). The object includes array, which is the whole array (or at least, this is how I suppose it works). But how are we to pass by reference to the n-th element of the array such that internal to the function, there is only string[] whose elements are one less than the original string[] without the need to create new array?

Must we use unsafe? I am looking for a solution (if possible) without unsafe

Edit:

I understand that we could pass Array in C# without ref keyword. Perhaps my question sounds quite misleading by mentioning ref when we talk about Array. The point why I put ref there, I should rather put it this way: is the ref keyword can be used, say, to pass the reference to n-th element of the array as much as C does other than passing reference to any object (without mentioning the n-th element or something alike)? My apology for any misunderstanding occurs by my question's phrasing.

like image 425
Ian Avatar asked Nov 29 '25 03:11

Ian


1 Answers

Edit:

You won't be able to do it as you do in C in safe code.

A C# array (i.e. string[]) is derived from abstract type Array. It is not only a simple memory block as it is in C.

So you can't send one of it's element's reference and start iterate from there.


But there are some solutions which will give you the same taste of course (without unsafe):

Like:

  • As @Chris mentioned you can use ArraySegment<T>.
  • As Array is also an IEnumerable<T> you can use .Skip and send the returned value. (but this will give you an IEnumerable<T> instead of an Array). But it will allow you iterate.
  • etc...
like image 77
Yves Avatar answered Dec 01 '25 17:12

Yves



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!