C# 通过对数组中某个元素的引用修改数组-是否有效?

C# 通过对数组中某个元素的引用修改数组-是否有效?,c#,arrays,value-type,ref,reference-type,C#,Arrays,Value Type,Ref,Reference Type,通过使用数组中元素的引用的方法修改数组中的值类型是安全的,如下所示?如果是这样的话,可以通过这种方式修改哪些类型的值?它是仅限于简单的值类型,还是struct也可以工作 // Method that sets an integer to x. void SetToX(ref int element, int x) { element = x; } // Int array with one element set to 0. int[] myIntArray = new int[1]

通过使用数组中元素的引用的方法修改数组中的值类型是安全的,如下所示?如果是这样的话,可以通过这种方式修改哪些类型的值?它是仅限于简单的值类型,还是
struct
也可以工作

// Method that sets an integer to x.
void SetToX(ref int element, int x) {
    element = x;
}

// Int array with one element set to 0.
int[] myIntArray = new int[1] {0};

// (Try to) set element 0 of the int array to 1.
SetToX(ref myIntArray[0], 1);

// Will this log "0" or "1"?
Log(myIntArray[0].ToString()); 
里德·科佩和阿列克谢·列文科夫提供的回答

这很好-示例代码将打印“1”。这也适用于任何值类型,包括
struct

但是,这只是数组的情况。如果尝试以这种方式修改其他类型的集合,系统将提示您:

属性、索引器或动态成员访问不能作为out或ref参数传递

这是因为实际上只有数组返回对元素中的值类型的引用。所有其他集合将返回元素的一个副本,使用ref将修改副本,保留原始副本不变。

是的,这很好

您的示例代码将打印:

1
如果是这样的话,可以通过这种方式修改哪些类型的值?它仅限于简单的值类型,还是结构也可以工作

// Method that sets an integer to x.
void SetToX(ref int element, int x) {
    element = x;
}

// Int array with one element set to 0.
int[] myIntArray = new int[1] {0};

// (Try to) set element 0 of the int array to 1.
SetToX(ref myIntArray[0], 1);

// Will this log "0" or "1"?
Log(myIntArray[0].ToString()); 

任何值类型。自定义的
struct
将具有相同的行为。

编写一个简单的控制台应用程序并进行尝试。验证你想要什么你考虑过试试吗?你确实有测试代码。测试它。@all-Yes-但是现在其他不知道的人可能有一些东西可以参考(谷歌搜索),而不需要创建测试程序。我想这是一件人们会毫不知情的事情,我愿意等待答案。@AlexeiLevenkov是真的,但这种情况下的错误相对来说是清楚的:“属性、索引器或动态成员访问可能不会作为out或ref参数传递”我不会称之为“C#中最令人费解的警告/行为之一” ;)+1:(更新注释)旁注:它只适用于数组-请参阅Reed关于使用其他集合时会发生什么的注释。(关于这个令人费解的警告——我把它与不同的场景混淆了——对存储在集合中的值类型调用mutating方法——可以很好地处理数组,但没有其他功能)感谢大家的帮助。另一方面,如果数组包含引用类型,可以用类似的方式修改引用本身吗?如果是这样,这是否也只适用于您描述的阵列?另外,如果我的代表足够高,我会投票支持你的答案@steve:是的,它适用于数组中的引用类型。是的,只使用数组的问题也是一样的。