2010-07-20 4 views
2

bien ... Je suis confus au sujet de ce que je peux faire et de ce que je ne peux pas faire dans CLASS SCOPE.Pourquoi et quand il y a des choses que je ne peux pas faire dans CLASS SCOPE en C#?

Par exemple

=========================

class myclass 
{ 


    int myint = 0; 

    myint = 5; *// this doesnt work. Intellisense doesn't letme work with myint... why?* 

    void method() 
    { 
    myint = 5; *//this works. but why inside a method?* 
    } 
} 

======== ==========================

class class1 
{ 
public int myint; 
} 

class class2 
{ 
    class1 Z = new class1(); 

    Z.myint = 5; *//this doesnt work. like Z doesnt exists for intellisense* 

void method() 
    { 
    Z.myint = 5; *//this Works, but why inside a method?* 
    } 
} 

Cest que je fais tant d'erreurs, je ne comprends pas ce qui fonctionne sur la classe portée et ce qui ne fonctionne pas.

Je sais qu'il existe des variables locales et leur cycle de vie. Mais je ne comprends pas si bien l'idée.

+0

Vous devez ajouter un constructeur (http://msdn.microsoft. com/fr-fr/library/ms173115.aspx) si vous voulez une alternative aux initialiseurs de champ – SwDevMan81

+0

Voir aussi (http://msdn.microsoft.com/en-us/library/aa691132(VS.71).aspx) pour the Scoping Language Specification – SwDevMan81

+3

Il s'agit d'une question assez simple, vous ne devriez donc pas vous arrêter de lire nos réponses. Au lieu de cela, vous bénéficieriez d'un tutoriel pour débutant. –

Répondre

8

Une classe ne peut contenir que déclarations, initialisations, et méthodes. Il ne peut pas contenir d'instructions .

class MyClass 
{ 
    int x; // a declaration: okay 
    int y = 5; // a declaration with an initialization: okay 
    int GetZ() { return x + y; } // a method: okay 

    x = y; // a statement: not okay 
} 
+1

+1: Toutes les "instructions de portée de classe" requises doivent être placées dans un constructeur. –

+0

+1: Rien ne "exécute" la classe, seules les méthodes (y compris les ctors & properties) à l'intérieur d'une classe peuvent être exécutées. –

+0

Nous devrions probablement noter que les propriétés comptent comme des méthodes ici. –

1

Vous pouvez initialiser un champ, mais vous ne pouvez pas avoir d'instructions d'affectation.

+0

Cette réponse semble être correcte, alors pourquoi a-t-elle été réduite? –

0

Fondamentalement, lorsque vous créez une classe, vous n'êtes pas autorisé à avoir le code & attributions à l'intérieur de cette classe directement.

mais comme C# veut vous aider, il vous permet de définir des états initiaux pour les champs. et ils sont essentiellement exécutés directement avant votre code constructeur.

lorsque vous voulez maintenant définir du code dans la classe. quelque part ... le programme ne sait pas, quand exécuter. donc ils sont interdits.

1

Vous ne pouvez pas faire le ci-dessous:

class myclass 
{ 
    int myint = 0; 
    myint = 5; 

Parce qu'il n'y a rien à faire, vous ne pouvez déclarer les membres et éventuellement définir une valeur initiale. Cela n'a rien à voir avec la portée. Une des raisons pour lesquelles vous ne pouvez pas le faire est qu'il n'y a aucune garantie d'ordre, le compilateur garantit que toutes les valeurs seront initialisées au moment où la classe est instanciée. Voilà pourquoi vous ne pouvez pas non effectuer les opérations suivantes:

class myclass 
{ 
    int myint = 0; 
    int MyOtherInt = myint; 

Si vous souhaitez définir la valeur lorsque la classe est instancié, le mettre dans le contructor.

+0

Mais si la classe a cette commande? class1 { int a; méthode void(); int b; } Sera cet ordre? a, méthode, b. ??? "b" ne peut pas être initialisé avant l'exécution de la "méthode", n'est-ce pas? – user396808

+1

Dans une définition de classe, les méthodes ne s'exécutent pas, vous les déclarez simplement de sorte que dans votre exemple, la méthode ne s'exécute pas du tout. –

+0

Mais que voulez-vous dire par "il n'y a pas de garantie de commande"? – user396808

0

Une définition de classe définit sa composition, c'est-à-dire les champs, propriétés, méthodes, événements, etc. qu'elle contient. Le "travail" est réellement fait à l'intérieur des méthodes. Ce qui vous semble déroutant est l'initialisation des champs d'une classe avec l'utilisation de ces champs. Vous pouvez initialiser un champ en dehors d'une définition de méthode, mais pour l'utiliser, vous devez être dans une méthode.

0

Pour bien comprendre et obtenir des réponses sur vos questions que vous devriez lire Richter « CLR via C#, Troisième édition » de Jeffrey et C# 4.0 Language Spectification

Questions connexes