参考类型(Class)的自动属性是否可以通过Ref传递?
我唯一想到的就是不使用自动属性:只需要像往常一样声明私有变量并通过ref传递它,如果需要的话,将公共属性添加到一边。
坦率地说,它看起来有点愚蠢(所有官僚机构都需要绕过它)
我的问题:
1.为什么编译器不允许自动属性通过ref传递(就像它是一个简单的数据成员)?
2.什么时候使用或应该使用Ref?我注意到有人说使用它可能只在极少数情况下才会发生。它们是什么?
答案 0 :(得分:9)
为什么编译器不允许自动属性通过ref传递
因为它不是参考 - 它是一个方法对(get / set)。解决方法是创建一个局部变量来保存属性的值,通过引用传递 ,并将属性设置为更新的值:
var temp = myObj.myProperty;
MethodWithRefParam(ref temp);
myObj.MyProperty = temp;
正如你所说,你可以通过引用传递支持属性,但只能从该类中传递。
我们什么时候使用或应该使用Ref?
通常 ref
(和out
,这是ref
)参数的一个特例,只有在返回时使用值不实用。 TryParse
是一个常见的框架示例。该方法不返回解析后的值,而是返回bool
,告诉您解析是否成功,并且"返回" out
参数中的已解析值。
将ref
与引用类型一起使用通常是一种代码气味,可能表明作者并不了解引用类型的工作原理。
答案 1 :(得分:1)
您使用自动属性,因为它允许您最终更改属性的实现方式而不会影响相关代码。在财产上没有任何特殊标记,它被实现为“自动”。即使您查看方法的IL,您也只会发现它是一个具有支持字段的属性。
结果编译器无法做出任何假设,如果此属性是自动生成的,并将所有属性视为常规属性。