簡體   English   中英

擴展方法,這是更好的選擇

[英]Extension methods, which is a better choice

以下是測試類

public class Test
{
   public int a;
}

以下是我創建的擴展方法:

public static class Extension
{    
  public static void Do1(this Test t,int value)
  {
     t.a = t.a + value;
  }

  public static Test Do2(this Test t,int value)
  {
     t.a = t.a + value;
     return t
  }
}

代碼用法:

Test t = new Test();
t.a = 5;

以下兩個調用都會導致ta, which is 10相同結果ta, which is 10

t.Do1(5)

t = t.Do2(5)

我的代碼中有很多實例需要實現類似的邏輯,哪個更好,其中一個是按值傳遞引用並在內部更新它,另一個是返回更新后的引用。 如果這種代碼進入多線程包裝器,那么使用其中一個是否更安全,前提是所有線程安全都得到了照顧。 通常要更新引用的變量,我們需要一個 ref 或 out 關鍵字,它類似於指向指針的指針,而不是像這種情況下指向同一內存位置的單獨指針,但在擴展方法中,我不能使用它們。 如果問題需要進一步澄清,請告訴我

在您的示例中,返回t變量沒有意義。 t是一個引用,所以設置ta已經更新了對象。 不需要refout或返回t 返回t原因之一是允許您使用方法鏈。

如果要實際更改引用,而不是引用的內容,則只需要refout

您實際上誤解了refout關鍵字的含義。 如果您想替換方法內的整個引用對象,則使用它們,對於簡單的屬性級別更新,根本不需要它們。

在您的示例中,由於Test是一個類(引用類型),因此兩種方法之間沒有實際區別,但是在Do2方法中返回初始Test對象毫無意義,因為對象已經更新。 所以最好的兩個將是第一個實現:

public static class Extension
{    
     public static void Do1(this Test t,int value)
     {
         t.a = t.a + value;
      }
}

回到 Do2 方法 - 正如我之前所說,引用的對象值已經在方法內部更新,因此將返回值分配給初始變量甚至沒有意義:

t.Do2(5)

是相同的

t.Do(5)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM