【发布时间】:2016-04-10 01:54:45
【问题描述】:
在 C 中,如果我们有一个数组,我们可以通过引用将它传递给一个函数。我们还可以使用简单的添加(n-1) 来传递从数组的第n 元素开始的引用,如下所示:
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]);
}
导致这些:
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.
在 C# 中,我们还可以通过 ref(或 out)传递对 object 的引用。该对象包括数组,它是 whole 数组(或者至少,我认为它是这样工作的)。但是我们如何通过引用数组的n-th 元素来传递,这样在函数内部,只有string[] 的元素比原始string[] 少一个,而无需创建新数组?
我们必须使用unsafe吗?我正在寻找没有unsafe的解决方案(如果可能)
编辑:
我知道我们可以在没有 ref 关键字的情况下在 C# 中传递 Array。当我们谈论Array 时提到ref,也许我的问题听起来很误导。为什么我把ref放在那里,我宁愿这样说:是ref关键字可以用来传递对数组的n-th元素的引用,就像C一样而不是传递对任何object 的引用(不提及n-th 元素或类似的东西)?我对问题的措辞表示对任何误解的道歉。
【问题讨论】:
-
您可以将数组和起始索引传递给它。该代码在
C中工作,因为(至少在这种情况下)数组和指针是可互换的。在C#中并非如此(不管它是如何在幕后实现的)。您应该将数组视为任何其他有序集合。 -
@Rob 是的,这是可能的解决方案,先生。你是对的,并不是我没有想到这种可能性(指传递起始索引),但我正在寻找一种替代方案,如果可能的话,就像我们本能地看到一个数组应该从索引 0 开始(如 C 示例),我们也可以在 C# 函数/方法中这样做。
-
似乎过早的优化? C# 会为你的文字字符串做字符串实习,所以我认为它已经被优化了。
-
@Rob 我的意思是,毕竟 C# 有
refkeyword。我想知道我们是否可以用它做更多我可能不知道的事情。 -
@JesseGood “文字字符串的字符串实习” 我不知道有这样的功能,先生。它是什么,有什么作用?
标签: c# arrays pass-by-reference