2010-11-15 12 views
4

Je lis le kit de formation MCTS auto-rythmé (70-536) Édition 2 et dans le 1er chapitre, nous avons ce qui suit.C# Initialisation des variables locales - Question du débutant

Comment déclarer un type de valeur variable Pour utiliser un type, vous devez d'abord déclarer un symbole comme une instance de ce type. Les types de valeur ont un constructeur implicite, donc les déclarer instancie le type automatiquement; vous ne devez pas inclure le nouveau mot clé comme vous le faites avec les classes. Le constructeur attribue une valeur par défaut (généralement nulle ou 0) à la nouvelle par exemple, mais vous devez toujours initialiser explicitement la variable dans la déclaration, comme le montre le bloc de code suivant:

'VB 

Dim b As Boolean = False  

// C# 
bool b = false; 

Cependant, quand je compile les éléments suivants Console application,

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Ch1_70_536 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      bool b; 
      Console.WriteLine("The value of b is " + b); 
      Console.ReadKey(); 
     } 
    } 
} 

j'obtiens l'erreur compilation

"Utilisation de la variable locale Unassigned b"

Il est même pas mentionné dans le Errata. Est-ce que je fais quelque chose de mal ou le livre est-il complètement faux?

Répondre

11

Le livre est surtout correct quand il s'agit de VB, mais il ne mentionne pas la différence entre VB et C# dans ce cas.

En VB toutes les variables locales sont initialisés automatiquement:

Sub Test() 
    Dim x As Integer 
    MessageBox.Show(x.ToString()) 'shows "0" 
End Sub 

Alors que dans C# variables locales ne sont pas initialisés, et le compilateur ne vous laissera pas les utiliser jusqu'à ce qu'ils soient:

void Test() { 
    int x; 
    MessageBox.Show(x.ToString()); // gives a compiler error 
} 

En outre, il n'est pas clair si la citation du livre parle réellement de variables locales ou de variables membres de classe. Les variables de membre de classe sont toujours initialisées lors de la création de l'instance de classe, aussi bien en VB qu'en C#.

Le livre est faux quand il dit que "Les types de valeur ont un constructeur implicite". Ce n'est tout simplement pas vrai. Un type de valeur est initialisé à sa valeur par défaut (s'il est initialisé), et il n'y a pas d'appel à un constructeur quand cela arrive.

2

Vous devez attribuer une valeur à b

bool b = false; 

Jusqu'à ce que vous lui attribuez une valeur est « non affecté »

4

Vous devez attribuer quelque chose à b sinon d'abord qu'il ne soit pas initialisé.

essayer:

bool b = false; 
Console.WriteLine("The value of b is " + b); 

b est maintenant faux.

12

Les variables locales doivent être affectées avant de pouvoir être utilisées. Les champs de classe ont cependant leur valeur par défaut.

Un exemple:

public bool MyMethod() 
{ 
    bool a; 

    Console.Write(a); // This is NOT OK. 

    bool b = false; 

    Console.Write(b); // This is OK. 
} 

class MyClass 
{ 
    private bool _a; 

    public void MyMethod() 
    { 
     Console.Write(_a); // This is OK. 
    } 
} 
+0

Merci pour la clarification. Ainsi, comme le souligne Nick, les variables locales sont * initialisées * mais ne peuvent pas être * utilisées * jusqu'à ce que nous lui assignions explicitement une nouvelle valeur. Correct? – Kanini

+0

Non, ils ne sont pas initialisés automatiquement. C'est pourquoi vous devez ** les initialiser vous-même. Seuls les champs de classe sont automatiquement initialisés pour vous. @Nick parle des champs de classe. –

2

une variable dans un procédé (méthode de portée) doit être explicitement initialisé. Une variable (ou 'champ') au niveau de la classe est initialisée automatiquement avec la valeur par défaut.

class Test 
{ 
    bool b; // =false 
    int i; // =0 
} 
1

Cette déclaration devrait vraiment être élaboré pour indiquer que, même si une variable locale peut être déclaré sans lui assigner une valeur, il ne peut pas être utilisé jusqu'à ce qu'il ait été attribué une valeur initiale:

le constructeur attribue une valeur par défaut (généralement nulle ou 0) à la nouvelle instance, mais vous devez initialiser toujours explicitement la variable dans la déclaration ...

+0

Je pense que vous voulez dire * déclaré * au lieu de * initialisé *. Vous ne pouvez pas initialiser un varialble sans lui affecter une valeur, c'est ce que vous faites lorsque vous l'initialisez. – Guffa

+0

Doh! Merci d'avoir fait remarquer cela. –

2

Rend le rôle de THUMB en C# et VB.net qu'avant d'appeler une variable, commencez par l'initialiser. comme

int myInt; // Simple Declaration and have no value in it 
myInt= 32; // Now you can use it as there is some value in it..