[英]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.