Pourquoi le mot clé 'this' ne peut-il pas être utilisé dans une méthode statique?
Pourquoi ne peut pas le mot-clé this
être utilisé dans une méthode statique? Je me demande pourquoi C# définit cette contrainte. Quels avantages peuvent être obtenus par cette contrainte?
[Mise à jour]:
En fait, c'est une question que j'ai eu dans une interview.
Je sais que l'utilisation de "statique" et "ce", basée sur l'ensemble de vos réponse, je crois que je sais un peu pourquoi les deux ne peuvent pas être utilisés ensemble. C'est, pour la méthode statique est utilisé pour changé d'état ou de faire quelque chose dans un type de niveau, mais quand vous avez besoin d'utiliser " ce " signifie que vous souhaitez modifier l'état ou de faire quelque chose dans un niveau de l'instance. Afin de différencier le changement d'état d'un type et le changement d'état d'une instance, alors c# ne pas permettre l'utilisation de 'cette' dans une méthode statique. Suis-je le droit?
source d'informationauteur airbai
Vous devez vous connecter pour publier un commentaire.
Parce que
this
points à une instance de la classe, dans la méthode statique vous n'avez pas de cas.Vous remarquerez la définition d'un membre statique est
C'est pourquoi
this
n'a rien à point.this
est une instance de l'objet courant. Avec une méthode statique, il n'y a pas d'objet en cours, et en tant que tel,this
n'existe pas. Ce n'est pas vraiment une contrainte, mais l'ensemble de la point d'une méthode de statique.this
se réfère à l'instance courante de la classe et peut donc être utilisé que dans les méthodes d'instance. Méthodes statiques agir sur le niveau de la classe, où il n'y a pas d'instances. Donc, pas dethis
.this
se réfère à l'instance actuelle de l'objet. Une méthode statique est une méthode de la classe. Ce n'est pas une méthode d'instance et, par conséquent, à l'aide de ce à l'intérieur d'une méthode statique est dénuée de sens.Je suis sûr que ce n'est pas limité à C# et ce n'est pas une contrainte, c'est une logique de la situation. @Youri correctement unis, cela fait référence à l'instance courante de la classe, c'est à dire que vous avez utilisé (ou DI) pour instancier la classe (création d'une instance de) et vous avez besoin de quelque façon à l'interne pour faire référence à cette instance, c'est à dire cet objet. Une méthode statique est appelée sans l'instanciation de la classe, il est, en effet, pas d'objet créé et en tant que tel, vous ne pouvez pas accéder à des propriétés dont c'est l'un.
Le mot-clé
this
se réfère à l'instance de l'objet. Dans le contexte statique, il n'est pas spécifique de l'instance de référence.Par des méthodes statiques, vous pouvez écrire:
qui il n'y a rien à voir avec une quelconque instance de l'objet (si vous n'avez pas besoin ce mot-clé).
Parce que static_method() fonctionne et n'a pas besoin de des instances de l'objet pour son travail. static_method() ne sait pas qui instance de l'objet avez-vous, mais il peut changer le comportement
de tous les des instances de l'objet:
Dans ce cas, static_method() modifie le comportement de la méthode display() dans tous les des instances de l'objet de MyClass.
this
est utilisé pour faire référence à l'objet parent d'une variable ou une méthode. Lorsque vous déclarezstatic
sur une méthode, la méthode peut être appelée sans avoir besoin d'instancier un objet de la classe. Par conséquent, lathis
mot clé n'est pas autorisée, car votre méthode statique n'est pas associé avec tous les objets."il" se réfère à une instance d'une classe. Statique est initialisé sans instanciation et donc la méthode statique ne peut pas se référer à une "instance" qui n'est pas créé.
La réponse pour vous: cela fait référence à une instance d'une classe qui est non existant dans une statique de la portée.
Mais s'il vous plaît, pour trouver un bon livre/de la classe et d'essayer de comprendre l'objet de base axée sur les concepts avant d'aller plus loin sur n'importe quel langage de programmation orienté objet.
Je ne suis pas sûr si cela permet de résoudre votre problème, mais je crois que ces deux extraits de code sont équivalentes:
et simplement
permettra tout à la fois les foo() la méthode dans le MyStaticClass classe, en supposant que vous appeler foo() à l'intérieur MyStaticClass
Modifier - le moyen Le plus facile de se rappeler la différence entre une classe statique et non statique de la classe est de penser à quelque chose comme la classe de Mathématiques en java. Vous pouvez appeler les Mathématiques.abs(x); pour obtenir la valeur absolue de x, et il ne fait pas vraiment sens pour instancier un objet Math, qui est pourquoi les Mathématiques est une classe statique.
Un autre, plus littérale, prendre sur votre question:
'Ce' mot-clé ne peut pas être utilisé dans une méthode statique pour éviter la confusion avec son utilisation dans les méthodes d'instance où il est le symbole pour accéder au pointeur (de référence) à l'instance passée automatiquement comme un paramètre caché de la méthode.
Si ce n'est pas que vous pourriez éventuellement définir une variable locale appelée "ceci" dans votre méthode statique, mais qui serait sans rapport avec le " ce " mot-clé référencé exemple, dans les méthodes d'instance.
Ci-dessous est un exemple avec les deux méthodes équivalentes, l'une statique, l'autre une méthode d'instance.
Les deux appels à la méthode va passer à un seul paramètre aux méthodes de l'exécution de code qui fait la même chose (imprimer l'objet de la représentation de chaîne sur la console) et le retour.
La
this
mot-clé peut être utilisé dans une méthode marquée commestatic
. La syntaxe utilisée pour définir les méthodes d'extension en C#. Cette fonctionnalité est disponible depuis C# 3.0, publié en 2007 (Wikipedia)Dans les conditions normales d'utilisation,
this
se réfère à l'instance,static
dit qu'il n'y a pas d'instance (et donc pas dethis
). Le fait que vous ne pouvez pas les utiliser ensemble (à part des exceptions comme les méthodes d'extension) découle naturellement du fait de la compréhension de ce quethis
etstatic
sont, sur le plan conceptuel.