2010-10-05 7 views
2

sur MSDN Je trouve:Déclarations seulement dans les méthodes, mais qu'en est-il des déclarations?

En C#, chaque instruction exécutée est fait dans le cadre d'une méthode.

Mais j'ai également lu qu'une instruction int A=5; peut être dans le corps de la classe. Il semble que ce n'est pas dans un corps de méthode, alors pourquoi est-ce possible? C'est probablement juste une confusion de termes, mais j'aimerais savoir.

+0

Je suis confus au sujet de moi-même ce que vous demandez. – Bernard

Répondre

6
class Example 
{ 
    int A = 5; 
} 

est égal à

class Example 
{ 
    int A; 

    public Example() 
    { 
     A = 5; 
    } 
} 

Ainsi, la mission est toujours partie d'une méthode (le constructeur).

+1

Cela peut être prouvé par la façon dont les champs marqués * readonly * peuvent être affectés dans la définition de classe OU dans le constructeur (seulement). – Michael

+3

@Michael - ça * le supporte *, mais ce n'est pas une preuve. La preuve est simple: c'est ainsi que les spécifications de langage le permettent. –

+3

En fait ce n'est pas tout à fait une vraie représentation; Les initialisers de champ iirc sont invoqués * avant * l'appel de base ctor. C# n'a aucun moyen d'exprimer cela bien que des corps de ctor irréguliers se produisent après l'appel de base de ctor. –

1

Vous parlez probablement initialisations sur le terrain:

class Foo 
{ 
    private static int i = 5; 
} 

Même cette instruction fonctionne dans le contexte d'une méthode. Dans ce cas particulier, c'est le constructeur statique. Si le champ n'est pas statique, ce sera le constructeur normal.

8

Adrian a raison. Pour clarifier davantage: "int A = 5;" est seulement une déclaration quand il est à l'intérieur d'un corps de méthode. Quand il est en dehors d'un corps de méthode, il s'agit d'une déclaration de champ avec un initialiseur, qui est logiquement déplacé dans le corps du constructeur.

La sémantique exacte du fonctionnement des initialiseurs est un peu compliquée. Pour quelques réflexions à ce sujet, voir:

http://blogs.msdn.com/b/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx