[英]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
已經更新了對象。 不需要ref
、 out
或返回t
。 返回t
原因之一是允許您使用方法鏈。
如果要實際更改引用,而不是引用的內容,則只需要ref
或out
。
您實際上誤解了ref
和out
關鍵字的含義。 如果您想替換方法內的整個引用對象,則使用它們,對於簡單的屬性級別更新,根本不需要它們。
在您的示例中,由於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.