小编典典

如何通过“引用”分配给c#中的类字段?

c#

我试图了解如何通过“引用”分配给c#中的类字段。

我有以下示例可供考虑:

 public class X
 {

  public X()
  {

   string example = "X";

   new Y( ref example );

   new Z( ref example );

   System.Diagnostics.Debug.WriteLine( example );

  }

 }

 public class Y
 {

  public Y( ref string example )
  {
   example += " (Updated By Y)";
  }

 }

 public class Z
 {

  private string _Example;

  public Z( ref string example )
  {

   this._Example = example;

   this._Example += " (Updated By Z)";

  }

 }

 var x = new X();

运行上面的代码时,输​​出为:

X(由Y更新)

并不是:

X(由Y更新)(由Z更新)

正如我所希望的。

似乎为字段分配“参考参数”会丢失参考。

分配给字段时,有什么方法可以保留引用?

谢谢。


阅读 335

收藏
2020-05-19

共1个答案

小编典典

编号ref纯粹是一个调用约定。您不能使用它来限定字段。在Z中,_Example被设置为传入的字符串引用的值。然后,您可以使用+
=为它分配一个新的字符串引用。您永远不会分配示例,因此ref无效。

所需的唯一解决方法是拥有一个包含引用(此处为字符串)的共享的可变包装对象(数组或虚拟StringWrapper)。通常,如果需要,可以找到更大的可变对象供类共享。

 public class StringWrapper
 {
   public string s;
   public StringWrapper(string s)
   {
     this.s = s;
   }

   public string ToString()
   {
     return s;
   }
 }

 public class X
 {
  public X()
  {
   StringWrapper example = new StringWrapper("X");
   new Z(example)
   System.Diagnostics.Debug.WriteLine( example );
  }
 }

 public class Z
 {
  private StringWrapper _Example;
  public Z( StringWrapper example )
  {
   this._Example = example;
   this._Example.s += " (Updated By Z)";
  }
 }
2020-05-19