Saltar al contenido

¿Puede un static ¿Se anulará el método en C#?

Posteriormente a buscar en diversos repositorios y sitios al concluir descubrimos la solución que te compartiremos más adelante.

Solución:

(1) Los métodos estáticos no se pueden anular; sin embargo, se pueden ocultar con la palabra clave 'nuevo'. La mayoría de los métodos anulados significa que hace referencia a un tipo base y desea llamar a un método derivado. Ya que staticson parte del tipo y no están sujetos a búsquedas en vtable que no tienen sentido.

Por ejemplo, la estática no puede hacer:

public class Foo  
    public virtual void Bar()  ... 

public class Bar : Foo 
    public override void Bar()  ... 


// use:
Foo foo = new Bar(); // make an instance
foo.Bar(); // calls Bar::Bar

Debido a que la estática no funciona en instancias, siempre especifica Foo.Bar o Bar.Bar explícitamente. Entonces anular no tiene sentido aquí (intenta expresarlo en código...).

(2) Hay diferentes usos para static métodos. Por ejemplo, se usa en el patrón Singleton para obtener una única instancia de un tipo. Otro ejemplo es 'static void Main', que es el punto de acceso principal en su programa.

Básicamente, los usa cuando no quiere o no puede crear una instancia de objeto antes de usarlo. Por ejemplo, cuando el static método crea el objeto.

[update]

Un simple ejemplo de ocultamiento:

public class StaticTest

    public static void Foo()  Console.WriteLine("Foo 1"); 
    public static void Bar()  Console.WriteLine("Bar 1"); 


public class StaticTest2 : StaticTest

    public new static void Foo()  Console.WriteLine("Foo 2"); 
    public static void Some()  Foo(); Bar();  // Will print Foo 2, Bar 1


public class TestStatic

    static void Main(string[] args)
    
        StaticTest2.Foo();
        StaticTest2.Some();
        StaticTest.Foo();
        Console.ReadLine();
    

Tenga en cuenta que si hace las clases static, no puedes hacer esto. Las clases estáticas tienen que derivar de object.

La principal diferencia entre esto y la herencia es que el compilador puede determinar en tiempo de compilación qué método llamar cuando se usa static. Si tiene instancias de objetos, debe hacer esto en tiempo de ejecución (lo que se denomina búsqueda en vtable).

No anulas un static método. Lo escondes. Ver esta respuesta para más información.

Algunas razones para usar static métodos:

  1. Son un poco más rápidos que los métodos de instancia. Consulte también este artículo de msdn que brinda números de rendimiento para respaldar esto (en línea static llamada promedio 0.2 ns, static llamada promedio 6.1ns, llamada de instancia en línea promedio 1.1 ns, llamada de instancia promedio 6.8 ns)
  2. Menos detallado para escribir: no es necesario crear una instancia de una clase para llegar a ellos (y la creación de instancias también puede afectar el rendimiento)

Bueno, no puedes anular un static método. A static El método no puede ser virtual, ya que no está relacionado con una instancia de la clase.

El método "reemplazado" en la clase derivada es en realidad un método nuevo, no relacionado con el definido en la clase base (de ahí la nueva palabra clave).

Es importante entender esto: cuando los tipos heredan de otros tipos, cumplen un contrato común, mientras que static tipos no están vinculados por ningún contrato (desde el punto de vista puro de programación orientada a objetos). No existe una forma técnica en el idioma de vincular dos static tipos junto con un contrato de "herencia". Si "anulara" el método Log en dos lugares diferentes.

Si piensas en anular static métodos, realmente no tiene sentido; para tener un envío virtual, necesita una instancia real de un objeto para verificar.

A static el método tampoco puede implementar una interfaz; si esta clase está implementando una interfaz IRolesService, diría que el método no debería ser static en absoluto. Es mejor diseño tener un método de instancia, por lo que puede intercambiar su MockRoleService con un servicio real cuando esté listo.

Sección de Reseñas y Valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *