簡體   English   中英

結構的擴展方法

[英]Extension methods on a struct

可以將擴展方法添加到結構中嗎?

是的,您可以在結構上添加擴展方法。 按照擴展方法的定義,您可以輕松實現它。 下面是int擴展方法的示例

namespace ExtensionMethods
{
    public static class IntExtensions
     {
        public static bool IsGreaterEqualThan(this int i, int value)
        {
            return i >= value;
        }
    }
}

可以向結構中添加擴展方法,但是有一個重要警告。 普通的struct方法方法接受this作為ref參數,但C#不允許定義這樣做的擴展方法。 盡管更改this方法的結構方法可能有些危險(因為編譯器將允許在只讀結構上調用結構方法,但按值傳遞this結構方法),但如果小心確保它們是正確的,它們有時也很有用。僅在適當的情況下使用。

順便說一句,vb.net確實允許擴展方法將this作為ByRef參數接受,無論它是類,結構還是未知類別的泛型。 這在某些接口可以由結構實現的情況下可能會有所幫助。 例如,如果嘗試調用List<string>.Enumerator類型的變量,則擴展方法將采用IEnumerator<string>類型的this參數,或者通過值采用受IEnumerator<string>約束的泛型的this參數。 ,並且如果該方法嘗試使枚舉數前進,則該方法返回時,任何前進都將被撤消。 一種擴展方法,該方法通過引用接受受約束的泛型,(可能在vb.net中)將表現出應有的表現。

對於將來的Google員工(和Bingers),這里有一些代碼可以擴展結構。 本示例將值轉換為double類型。

public static class ExtensionMethods {

   public static double ToDouble<T>(this T value) where T : struct {
      return Convert.ToDouble(value);
   }
}

之后,您可以像使用ToString()一樣使用ToDouble() ToString() 請小心轉換項,例如溢出。

是的,您可以在結構/值類型上定義擴展方法。 但是,它們的行為與引用類型的擴展方法不同。

例如,以下C#代碼中的GetA()擴展方法將接收該結構的副本 ,而不是對該結構的引用。 這意味着結構上的C#擴展方法無法修改原始結構內容。

public static class TestStructExtensionMethods {
    public struct FooStruct {
        public int a;
    }
    public static int GetA(this FooStruct st) {
        return st.a;
    }
}

為了修改結構內容,需要將結構參數聲明為“ ref”。 但是,在C#中不允許使用“此引用”。 我們能做的最好的事情是靜態的非擴展方法,例如:

// this works, but is inefficient, because it copies the whole FooStruct
// just to return a
public static int GetA(ref FooStruct st) {
    return st.a;
}

在VB.NET中,可以將其創建為ByRef結構擴展方法,以便可以修改原始結構:

' This is efficient, because it is handed a reference to the struct
<Extension()> _ 
Public Sub GetA(ByRef [me] As FooStruct) As Integer
    Return [me].a
End Sub

' It is possible to change the struct fields, because we have a ref
<Extension()> _ 
Public Sub SetA(ByRef [me] As FooStruct, newval As Integer) 
    [me].a = newval
End Sub

暫無
暫無

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

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