2011-02-02 44 views
6

¿Hay un equivalente de this en C# para miembros estáticos?¿Hay un equivalente de 'esto' en C# para miembros estáticos?

Me gusta usar this para hacer que mi código sea más legible, pero me preguntaba si había un equivalente para miembros estáticos.

+0

Gracias a todos por sus respuestas. Aprecio ahora que la respuesta simple a estas preguntas es 'no', pero mi punto era averiguar si había una manera de distinguir entre un miembro estático perteneciente a la clase que estoy trabajando o soy miembro de otra clase. Mi conclusión es que, estilísticamente, sería mejor utilizar el nombre de la clase cuando se trabaja en otra clase (un requisito previo de todos modos) y sin nombre de clase cuando en la clase misma. Daré la respuesta a @AakashM por la explicación rápida y exhaustiva (o exhaustiva). :-) –

Respuesta

13

supongo que si se utiliza para reforzar this. que se está refiriendo a los miembros de instancia, el equivalente de un miembro estático sería utilizar ClassName.

Pero estilísticamente, ¿por qué añadir código que no cambia lo que significa?


edición añadir varias aclaraciones:

Mi última frase anterior se puede ilustrar con estos ejemplos:

class Example1 
{ 
    public int J { get; set; } 

    public Example1() 
    { 
     J = 0; 
    } 

    // These two methods have *exactly* the same CIL 
    public int InstanceMethodLong() 
    { 
     return this.J; 
    } 

    public int InstanceMethodShort() 
    { 
     return J; 
    } 
} 

El this. en InstanceMethodLong no cambia el significado que se compara con InstanceMethodShort.

estáticamente:

class Example2 
{ 
    public static int K { get; set; } 

    static Example2() 
    { 
     K = 0; 
    } 

    // These two methods have *exactly* the same CIL 
    public int StaticMethodLong() 
    { 
     return Example2.K; 
    } 

    public int StaticMethodShort() 
    { 
     return K; 
    } 

El Example2. en StaticMethodLong no cambia el significado que en comparación con StaticMethodShort.

En ambos casos, agregar los resultados del calificador en el mismo CIL, el mismo comportamiento y es más fuente para escribir, leer y comprender. Estilísticamente - y felizmente aceptaré que esta es una cuestión de estilo de código - No veo ninguna razón para que esté allí.


Con prefijos de relieve la situación es ligeramente diferente:

class Example3 
{ 
    int _j; 

    public int J 
    { 
     get { return _j; } 
     set 
     { 
      _j = value; 
      // and do something else, 
      // to justify not using an auto-property 
     } 
    } 

    public Example3() 
    { 
     J = 0; 
    } 

    public int MethodWithParameter(int j) 
    { 
     // Now there is a *difference* between 
     return j; 

     // and 
     return _j; 
    } 
} 

Aquí, en MethodWithParameter, hay una diferencia entre referirse a _j y j - por lo que estamos expresando deliberada y explícitamente significado diferente . Es cierto que al compilador no le importa lo que llamamos nuestros nombres de variables, pero importa a qué variables nos referimos. Entonces, en el cuerpo de MethodWithParameter, el uso o no de un guión bajo no es simplemente estilístico, es semántico. Cuál no es el problema particular que abordamos en esta pregunta.

+7

Podría cambiar el significado del * maintainer * del código. Al compilador no le importa una cosa u otra. –

+0

¿Hay alguna manera de hacer que este tipo no sea consciente de la 'selftype.name'? (es decir, si quiero cambiar el nombre de mi clase) – xtofl

+0

@Eric De hecho estoy de acuerdo en que "el código debe escribirse principalmente para personas y solo de manera incidental para computadoras" - PERO estamos en la cima de una * muy * pendiente resbaladiza - Me gustaría Prefiero apuntarme a estar en un lugar donde mis compañeros mantenedores entiendan mi intención exactamente de la misma manera que lo hace el compilador, en lugar de satisfacer la comprensión incompleta de mis colegas mantenedores. ¿Qué sigue, "evitar LINQ porque a algunas personas les resulta confuso"? – AakashM

2

Puede utilizar el nombre de la clase para hacer referencia a otras propiedades estáticas.

Su código se vuelve un poco más resistente para copiar/pegar, pero eso no siempre es malo.

1

Me gusta "esto" así como realsie desde el primer vistazo donde el estado está cambiando. Es posible que desee considerar el nombre del tipo para los miembros estáticos en este caso.

2

Desafortunadamente no, no hay this para métodos estáticos. Para ayudar a diferenciar los miembros estáticos de los miembros de la clase, lo prefijo con el nombre de la clase.

class Test { 
    static Regex TextRegex = new Regex(...); 

    public static bool TestString(string input) { 
    return Test.TextRegex.IsMatch(input); 
    } 
} 
3

Como miembro estático no tiene la intención de pertenecer a cualquier caso particular (como this se refiere a una instancia de un objeto, con diferentes configuraciones posibles por ejemplo), lo que debe en su lugar queremos hacer es usar ClassName.Member vez de this.Member.

public class Orange 
{ 
    public static string Tastes = "sweet"; 

    public static string FoodType(){ 
     return "fruit"; 
    } 
} 

sería llamado por:

Console.WriteLine(Orange.Tastes); 

Lo mismo sucede con los métodos estáticos, así:

Console.WriteLine(Orange.FoodType()). 

Tenga en cuenta que este es un ejemplo artificial para la demostración solamente. :)

Cuestiones relacionadas