2009-05-13 26 views
8

En C# cuando quiero llamar a un método estático de una clase desde otro método estático de esa clase, ¿existe un prefijo genérico que puedo usar como PHP self:: en lugar del nombre de clase?¿Cuál es el equivalente de C# al "self ::" de PHP?

Así, en el ejemplo de abajo, en lugar de decir Customer.DatabaseConnectionExists(), ¿cómo puedo decir algo como Self.DatabaseConnectionExists() así por ejemplo, más tarde, si cambio el nombre de la clase, ¿no tengo que cambiar todos los prefijos?

class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public static Customer GetCurrentCustomer() 
    { 
     if (Customer.DatabaseConnectionExists()) 
     { 
      return new Customer { FirstName = "Jim", LastName = "Smith" }; 
     } 
     else 
     { 
      throw new Exception("Database connection does not exist."); 
     } 
    } 

    public static bool DatabaseConnectionExists() 
    { 
     return true; 
    } 
} 
+0

No estoy al tanto de nada, pero ¿por qué no debería ir a "Refactorizar" a través del menú contextual? Igualmente le salvará de los problemas manuales de edición – annakata

+1

pero al menos de mi experiencia leyendo código PHP, Si ve "self ::", sabe que está haciendo referencia a esa clase, no importa cómo se llame, si ve "Customer ::", debe mirar alrededor para ver si realmente está en la clase Customer o no. Simplemente hace que el código sea un poco más explícito, algo que estaba acostumbrado a ver. –

Respuesta

15

no hay un equivalente real - lo que tiene que especificar el nombre de la clase, es decir

Customer.DatabaseConnectionExists() 

o pierda el calificador por completo, es decir

DatabaseConnectionExists() 

Este último estilo de la llamada es aconsejable ya que es más simple y no pierde ningún significado. Además, está más en línea con las llamadas a métodos en instancias (es decir, llamando por InstanceMethod() y nothis.InstanceMethod(), que es excesivamente detallado).

+3

Creo que haría que su código sea más fácil de leer si usa "esto". por ejemplo, métodos y "ClassName". para métodos estáticos; de lo contrario, no lo sabrá echando un vistazo a una llamada a método si es para una instancia o estática. Pasar de PHP a C# Siento que a menudo tengo que mirar alrededor en el contexto del código para descubrir esta diferencia. –

+0

@Edward Tanguay: Entiendo por qué piensas esto, pero en realidad solo es demasiado detallado (al menos en mi opinión). Muy rara vez verá métodos llamados usando this.MethodName(), simplemente porque va en contra de la mayoría de las pautas de diseño. El uso de 'this' con campos y propiedades, por otro lado, varía ampliamente. – Noldorin

0

No, no hay. Pero con las herramientas de refactorización, cambiar el nombre de una clase no debería preocuparte demasiado.

13

Si llama al método desde dentro de la clase, no necesita especificar nada como :: Self, solo el nombre del método lo hará.

class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public static Customer GetCurrentCustomer() 
    { 
     if (DatabaseConnectionExists()) 
     { 
      return new Customer { FirstName = "Jim", LastName = "Smith" }; 
     } 
     else 
     { 
      throw new Exception("Database connection does not exist."); 
     } 
    } 

    public static bool DatabaseConnectionExists() 
    { 
     return true; 
    } 
} 
+0

Estaba escribiendo la misma respuesta + el hecho de que podríamos usar una herramienta de refactorización en caso de que deseemos cambiar el nombre de la clase. Personalmente, utilizo la herramienta de refactorización "Resharper". – Nordes

4

Simplemente déjalo fuera. DatabaseConnectionExists se define dentro de la clase.

2

Simplemente llámalo sin ningún prefijo.

Cuestiones relacionadas