是否有可能通过ref来传递属性?加上通过引用

本文关键字:属性 引用 有可能 ref 是否 | 更新日期: 2023-09-27 18:04:21

是否有可能为引用类型(类)的自动属性做解决方案,以便能够通过Ref?

我唯一想到的是不使用自动属性:只是像往常一样声明私有变量,并通过ref +传递它,如果我需要的话,添加公共属性。
坦率地说,这看起来有点愚蠢(所有的官僚机构都需要绕过它)


我的问题:1.为什么编译器不允许自动属性通过ref传递(就像它是一个简单的数据成员)?2.什么时候应该使用Ref?我注意到有些人说,使用它可能只在极少数情况下发生。它们是什么?

是否有可能通过ref来传递属性?加上通过引用

为什么编译器不允许自动属性通过ref

传递

因为它不是一个引用——它是一个方法对(get/set)。解决方法是创建一个保存属性值的局部变量,通过引用传递,并将属性设置为更新后的值:

var temp = myObj.myProperty;
MethodWithRefParam(ref temp);
myObj.MyProperty = temp;

正如您所说,可以通过引用传递backing属性,但只能从该类中传递。

什么时候应该使用Ref?

通常 ref (outref的特例)参数只在返回值不实用时使用TryParse是一个常见的框架示例。该方法不是返回解析后的值,而是返回一个bool,告诉您解析是否成功,并在out参数中"返回"解析后的值。

在引用类型中使用ref通常是一种代码气味,可能表明作者不理解引用类型是如何工作的。

您使用自动属性是因为它允许您最终在不影响相关代码的情况下更改属性的实现方式。在财产上没有任何特殊的标记,表明它是"自动"实现的。即使你看一下这个方法的IL,你也只会发现它是一个带有backing字段的属性。

作为结果,如果该属性是自动生成的,编译器不能做任何假设,并将所有属性视为常规属性。