亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過“引用”將其分配給c#中的類字段?

如何通過“引用”將其分配給c#中的類字段?

C#
守候你守候我 2019-08-19 16:22:16
如何通過“引用”將其分配給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更新)正如我所希望的那樣。似乎為字段分配“ref參數”會丟失引用。在分配字段時有沒有辦法保持引用?謝謝。
查看完整描述

3 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

正如其他人所指出的那樣,你不能擁有“ref to variable”類型的字段。然而,只知道你不能做到這一點可能并不令人滿意; 你可能也想先知道,為什么不知道,其次,如何解決這個限制。

原因是因為只有三種可能性:

1)禁止ref類型的字段

2)允許ref類型的不安全字段

3)不要將臨時存儲池用于局部變量(也稱為“堆?!保?/p>

假設我們允許ref類型的字段。然后你可以做到

public ref int x;void M(){
    int y = 123;
    this.x = ref y;}

現在可以在M完成后訪問y 。這意味著要么我們遇到(2) - 訪問this.x將崩潰并且死亡可怕因為y的存儲不再存在 - 或者我們遇到(3),并且本地y存儲在垃圾收集堆上,而不是臨時內存池。

我們喜歡將局部變量存儲在臨時池中的優化,即使它們是由ref傳遞的,我們也不喜歡你可能會留下定時炸彈,這可能會導致程序崩潰并在以后死亡。因此,選項一是:沒有引用字段。

注意,對于作為匿名函數的封閉變量的局部變量,我們選擇option(3); 這些局部變量不會從臨時池中分配出來。

這就引出了第二個問題:你如何解決這個問題?如果你想要一個ref字段的原因是制作另一個變量的getter和setter,那就完全合法了:

sealed class Ref<T>{
    private readonly Func<T> getter;
    private readonly Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value { get { return getter(); } set { setter(value); } }}...Ref<int> x;void M(){
    int y = 123;
    x = new Ref<int>(()=>y, z=>{y=z;});
    x.Value = 456;
    Console.WriteLine(y); // 456 -- setting x.Value changes y.}

你去吧 y存儲在gc堆上,x是一個能夠獲取和設置的對象y

請注意,CLR確實支持ref本地和ref返回方法,但C#不支持。也許C#的假設未來版本將支持這些功能; 我有它的原型,它運作良好。但是,這在優先級列表中并不是很高,所以我不會抱有希望。

更新:上面段落中提到的功能最終在C#7中實現了。但是,您仍然無法在某個字段中存儲引用。


查看完整回答
反對 回復 2019-08-19
  • 3 回答
  • 0 關注
  • 538 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號