2011-09-20 2 views
1
static void Main(string[] args) 
{ 
    int test = 1; 

    resetTest(); 

    Console.Write(test); // Should be 0 
} 

static void resetTest() 
{ 
    test = 0; 
} 

Pourquoi cela ne fonctionne-t-il pas? Comment puis-je l'avoir? (Je ne veux pas utiliser la fonction int et revenir à la variable) Maintenant, j'ai un message d'erreur qui dit que le test de variable est indéfini sur la fonction resetTest.Réinitialisation d'une variable via la fonction vide

Répondre

5

car le test est défini dans le cadre de votre méthode Main.

Vous devrez le déplacer en dehors de cette méthode pour que cela fonctionne.

Quelque chose comme:

static int test = 1; 

static void Main(string[] args) 
{ 

    resetTest(); 

    Console.Write(test); // Should be 0 
} 

static void resetTest() 
{ 
    test = 0; 
} 
+1

Je comprends, merci beaucoup. Je vais vous marquer répondre dans 8 min. – Luis

+2

Bien que les variables globales soient utiles, il faut faire attention à les utiliser. Cela peut devenir votre pire cauchemar. – Sergio

2

Le test de variable est local à la procédure principale. Vous devriez le déclarer en dehors de cette portée.

static int test = 0; 

static void Main(string[] args) 
{ 
    test = 1; 
    Console.Write(test); // Should be 1 
    resetTest(); 
    Console.Write(test); // Should be 0 
} 

static void resetTest() 
{ 
    test = 0; 
} 
2

Ce n'est pas un problème avec le retour d'annulation. Le problème est que ce test est limité à la méthode Main. Vous devriez en faire un champ statique pour faire ce que vous voulez.

2

cela fonctionnera

static int test = 1; 
static void Main(string[] args) 
{ 


    reserTest(); 

    Console.Write(test); // Should be 0 
} 

static void resetTest() 
{ 
    test = 0; 
} 
2
essai

est une variable locale à votre fonction principale. Vous ne pouvez donc pas y accéder à partir d'une fonction séparée.

Vous devez le promouvoir dans une variable membre (statique, dans votre cas) de votre classe si vous voulez le faire.

2

test est une variable locale à Main(). Donc resetTest() ne peut même pas y accéder, oubliez de le réinitialiser.

2

test n'est pas accessible dans votre fonction resetTest() car la portée de la variable locale test est votre fonction Main.

Vous devez passer par ref si vous souhaitez modifier la valeur de la fonction resetTest()

2

Il y a deux options.

1) Vous pouvez passer la variable, par référence, à la fonction:

static void resetTest(ref int test) 
{ 
    test = 0; 
} 

Cela vous permet de modifier cette variable (ou tout autre).

2) Vous pouvez déclarer en dehors du Main, comme locale int statique du type lui-même:

static int test; 

static void Main(string[] args) 
{ 
    resetTest(); 

    Console.Write(test); // Should be 0 
} 

static void resetTest() 
{ 
    test = 0; 
} 

Cela met en place pour l'ensemble de type .

2

Cela ne fonctionne pas car vous avez défini test comme étant local à la méthode statique Main. Essayez de le définir comme

private static int test = 1; 

Dans votre définition de classe, mais en dehors de toute méthode.

2

Il s'agit d'un problème de portée et de variable statique.La portée du test est maintenant uniquement pour la fonction principale, donc resetTest ne peut même pas y accéder.

Actuellement, vous avez défini resetTest comme static method. Pour modifier une variable dans une méthode statique, cette variable doit être transmise comme référence (répondue dans une autre réponse) ou la variable doit être une variable statique de cette classe.

Donc, vous avez quelque chose d'un peu de code mésapparié, au courant.

public class SomeClass { 
    public int test = 1; 

    static void Main(string[] args) { 
     SomeClass myClass = new SomeClass(); // Will instantiate test as 1 
     myClass.resetTest(); 

     Console.Write(myClass.test); // Should be 0 
    } 

    public void resetTest() { 
     test = 0; 
    } 
} 
2

La variable d'essai n'a pas reposée, et si vous voulez atteindre cet objectif, non seulement pour le test mais pour toute Int en toi sont app. de cette façon, vous devez passer par variable Reference

static void Main(string[] args) 
{ 
    int test = 1; 
    reserTest(ref test); 

    Console.Write(test); // Should be 0 now 
} 

static void resetTest(ref int i) 
{ 
    i = 0; 
} 
2

Vous avez défini la variable « test » dans la méthode principale, il existe seulement à l'intérieur.

Vous pourriez (Ne pas le faire, juste parce que vous pouvez ne signifie pas que vous devriez) 1:

  • Placez la déclaration en dehors de la méthode

    int test = 1; 
    
    static void Main(string[] args) 
    { 
        resetTest(); 
    
        Console.Write(test); // Should be 0 
    } 
    
    static void resetTest() 
    { 
        test = 0; 
    } 
    
  • Envoyer la variable par référence:

    static void Main(string[] args) 
    { 
        int test = 1; 
        resetTest(ref test); 
    
        Console.Write(test); // Should be 0 
    } 
    
    static void resetTest(ref int test) 
    { 
        test = 0; 
    } 
    

De toute façon vous devriez lire un peu sur les étendues: http://www.blackwasp.co.uk/CSharpVariableScopes.aspx

Questions connexes