2010-08-11 19 views
10

¿Por qué no se puede usar la palabra clave this en un método estático? Me pregunto por qué C# define esta restricción. ¿Qué beneficios se pueden obtener con esta restricción?¿Por qué la palabra clave 'this' no se puede usar en un método estático?

[Actualización]: En realidad, esta es una pregunta que recibí en una entrevista. Sé el uso de 'estático' y 'esto', en base a toda su respuesta, supongo que sé un poco de por qué los dos no se pueden usar juntos. Es decir, para el método estático se usa para cambiar el estado o hacer algo en un nivel de tipo, pero cuando necesita usar 'esto' significa que quiere cambiar el estado o hacer algo en un nivel de instancia. Para diferenciar el cambio de estado de un tipo y el cambio de estado de una instancia, C# no permita el uso de 'esto' en un método estático. ¿Estoy en lo cierto?

+46

si hace esta pregunta, probablemente no entendió qué significa 'estático';) –

+0

Miembros estáticos y clases estáticas (Guía de programación C#): http://msdn.microsoft.com/es-es/ /library/79b3xss3.aspx –

+2

¿Puede decirnos qué quiere hacer y por qué cree que implicaría la combinación de 'static' y' this'? Por lo general, si necesita mezclar los dos, llame a un método estático desde un método no estático (o haga referencia a un campo, establezca una propiedad, etc.) – jnylen

Respuesta

56

Dado que this apunta a una instancia de la clase, en el método estático no tiene una instancia.

The this keyword refers to the current instance of the class. Static member functions do not have a this pointer

Se dará cuenta de la definición de un miembro estático es

Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object

Por eso this no tiene nada que señalar.

+2

Explique por qué no hay una instancia en un método estático :) – Blixt

+3

Piense en cómo llama a los métodos estáticos. Class.Method() como Animal.Eat() Nunca necesitó una instancia (nuevo Animal()) para llamar al método estático. Es por eso que no hay ninguno. – Blub

+15

No me puedo imaginar un animal estático, sin mencionar uno que come. – jessegavin

1

La palabra clave this hace referencia a la instancia del objeto. En el contexto estático no hay instancia específica para referencia.

12

this es una instancia del objeto actual. Con un método estático, no hay un objeto actual, y como tal, this no existe. No es realmente una restricción, pero el punto entero de un método es static.

2

this se refiere a la instancia actual de una clase y, por lo tanto, se puede usar solo en métodos de instancia. Los métodos estáticos actúan en el nivel de clase, donde no hay instancias. Por lo tanto, no this.

2

this se refiere a la instancia actual del objeto. Un método estático es un método en la clase. No es un método de instancia y, por lo tanto, usarlo dentro de un método estático no tiene sentido.

0

this se utiliza para hacer referencia al objeto primario de una variable o método. Cuando declara static en un método, se puede llamar al método sin necesidad de crear una instancia de un objeto de la clase. Por lo tanto, la palabra clave this no está permitida porque su método estático no está asociado con ningún objeto.

2

Estoy bastante seguro de que esto no se limita a C# y no es una limitación, es una situación lógica. Como @Yuriy declara correctamente, esto se refiere a la instancia actual de una clase, es decir, has usado new (o DI) para instanciar la clase (ha creado una instancia de) y necesitas una forma interna para referirte a esa instancia, es decir, objeto. Se llama a un método estático sin crear una instancia de la clase, no hay, en efecto, ningún objeto creado y, como tal, no se puede acceder a las propiedades de las que se trata.

+0

Para 'esto no se limita a C# y no es una restricción, es una situación lógica', acepto:) – airbai

0

'this' se refiere a una instancia de una clase. Static se inicializa sin instanciación y, por lo tanto, el método estático no puede referirse a una 'instancia' que no se crea.

1

Por métodos estáticos puede escribir:

MyClass.static_method(); 

cual no hay nada que ver con cualquier instancia de objeto (por lo que no es necesario esta palabra clave).

Porque static_method() funciona y no necesita instancias de objeto para su trabajo. static_method() no sabe qué instancia de objeto tiene usted, pero puede cambiar el comportamiento de todas las instancias de objetos :

MyClass a = new MyClass(); 
MyClass b = new MyClass(); 
MyClass.static_method("PRINTER"); 
a.display(); //print something 
b.display(); //print something 
MyClass.static_method("MONITOR"); 
a.display(); //display something on monitor 
b.display(); //display something on monitor 

En este caso, static_method() cambia el comportamiento de la pantalla () método en todas las instancias de objetos de MyClass.

+1

Aquí estás mezclando C++ y C#, creo. – strager

+0

Tienes razón ... Lo cambié :) –

0

La respuesta corta para usted será: esto se refiere a una instancia de una clase que no existe en un ámbito estático.

Pero, por favor, busque un buen libro/clase y trate de comprender los conceptos básicos orientados a objetos antes de ir más allá en cualquier lenguaje de programación orientado a objetos.

0

No estoy seguro de si esto ayuda a su problema, pero creo que estos dos fragmentos de código son equivalentes:

MyStaticClass.foo(); 

y simplemente

foo(); 

los dos para llamar al método foo() en el Clase MyStaticClass, suponiendo que llame a foo() desde dentro de MyStaticClass

Edición - La manera más fácil de recordar la diferencia entre una clase estática y una clase no estática es pensar en algo así como la clase de Matemáticas en java. Puedes llamar a Math.abs (x); para obtener el valor absoluto de x, y realmente no tiene sentido crear una instancia de un objeto Math, por lo que Math es una clase estática.

0

Otro, más literal, tomar a la pregunta: ¿

El 'esto' palabra clave no se puede utilizar en un método estático para evitar la confusión con su uso en los métodos de instancia donde es el símbolo para acceder al puntero (referencia) a la instancia pasada automáticamente como un parámetro oculto al método.

Si no fuera así, podría definir una variable local llamada 'this' en su método estático, pero que no estaría relacionada con la instancia 'referenciada' de esta palabra clave en los métodos de instancia.

A continuación se muestra un ejemplo con dos métodos equivalentes, uno estático y el otro un método de instancia. Ambas llamadas de método pasarán un único parámetro a los métodos que ejecutan código que hará lo mismo (imprimir la representación de cadena del objeto en la consola) y devolver.

public class Someclass { 

    void SomeInstanceMethod() 
    { System.Console.WriteLine(this.ToString()); } 

    void static SomeStaticMethod(Someclass _this) 
    { System.Console.WriteLine(_this.ToString()); } 

    public void static Main() 
    { 
     Someclass instance = new Someclass(); 
     instance.SomeInstanceMethod(); 
     SomeStaticMethod(instance); 
    } 
} 
+0

Gracias jleedev por el formateo. No sabe cómo hacerlo, todavía. :) – Monoman

0

La palabra clave this puede usarse en un método marcado como static. La sintaxis se usa para definir extension methods in C#. Esta característica ha estado disponible desde C# 3.0, lanzado en 2007 (Wikipedia)

En el uso normal, this refiere a la instancia, static dice que no hay ninguna instancia (y por lo tanto no this). El hecho de que no pueda usarlos juntos (aparte de excepciones especiales como los métodos de extensión) se desprende naturalmente de la comprensión de lo que this y static son, conceptualmente.

Cuestiones relacionadas