rural que metodos metodo matematicas extensión extension estadistica definicion clases c# .net struct extension-methods

c# - que - metodos de extension rural



Métodos de extensión en una estructura (4)

Es posible agregar métodos de extensión a las estructuras, pero hay una advertencia importante. Los métodos normales de métodos struct aceptan this como un parámetro ref , pero C # no permitirá la definición de métodos de extensión que lo hagan. Si bien los métodos struct que modifican this pueden ser algo peligrosos (dado que el compilador permitirá invocar los métodos struct en estructuras de solo lectura, pero pasar this por valor), a veces también pueden ser útiles si se tiene cuidado de asegurarse de que sean solo se usa en contextos apropiados.

A propósito, vb.net permite que los métodos de extensión lo acepten como un parámetro ByRef , ya sea una clase, estructura o un genérico de categoría desconocida. Esto puede ser útil en algunos casos donde las interfaces pueden ser implementadas por estructuras. Por ejemplo, si intenta invocar en una variable de tipo List<string>.Enumerator un método de extensión que toma un parámetro de tipo IEnumerator<string> , o toma por valor a this parámetro de un genérico restringido a IEnumerator<string> , y si el método intenta avanzar al enumerador, cualquier avance se deshará cuando regrese el método. Sin embargo, un método de extensión que toma un genérico restringido por referencia (posible en vb.net) se comportará como debería.

¿Puedes agregar métodos de extensión a una estructura?


Para futuros Googlers (y Bingers), aquí hay un código para extender una estructura. Este ejemplo convierte el valor en un tipo double .

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

Después de esto, puede usar ToDouble() como si usara ToString() . Tenga cuidado con los elementos de conversión como desbordamientos.


Sí, puede agregar métodos de extensión en las estructuras. Según la definición del método de extensión, puede lograrlo fácilmente. A continuación se muestra un ejemplo del método de extensión en int

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


Sí, puede definir un método de extensión en un tipo de estructura / valor. Sin embargo, no tienen el mismo comportamiento que los métodos de extensión en los tipos de referencia.

Por ejemplo, el método de extensión GetA () en el siguiente código C # recibe una copia de la estructura, no una referencia a la estructura. Esto significa que un método de extensión C # en una estructura no puede modificar el contenido original de la estructura.

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

Para modificar el contenido de la estructura, el struct paramater debe declararse como "ref". Sin embargo, "esta referencia" no está permitida en C #. Lo mejor que podemos hacer es un método estático de no extensión como:

// 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; }

En VB.NET, puede crear esto como un método de extensión de estructura ByRef, por lo que podría modificar la estructura original:

'' 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