2009-10-21 14 views
0

Sans initialisation, comment est-il possible d'affecter des valeurs à des tableaux?Affectation de valeur en C#

string[] s={"all","in","all"}; 

I mean why did not the compile show error?.Normally we need to 
initialize ,before assign values. 
+0

Tout comme vous avez montré ... Ou je ne comprends pas la partie de la question ici. –

+0

Je ne suis pas sûr d'avoir la question. –

+0

Avons-nous découvert l'équivalent stackoverflow de 'comment se forme babby?' – Chris

Répondre

6

C'est juste du sucre syntaxique.

Ce:

string[] s = {"all","in","all"}; 

est compilé dans le même code que:

string[] tmp = new string[3]; 
tmp[0] = "all"; 
tmp[1] = "in"; 
tmp[2] = "all"; 
string[] s = tmp; 

Notez que la référence de tableau n'est pas affecté à s jusqu'à ce que tous les éléments ont été assignés.Ce n'est pas important dans ce cas particulier où nous déclarer une nouvelle variable , mais il ferait un autre dans cette situation:

string[] s = { "first", "second" }; 
s = new string[] { s[1], s[0] }; 

en est de même pour objet et collecte initializers - la variable est seulement attribué à la fin.

+0

Est-ce que cette relaxation est seulement pour Array? – user193276

+3

ooh J'ai trouvé un bug dans le code de John Skeet! s n'est pas défini, ligne 2. Je pense que vous vouliez dire tmp [0] = "all"; –

+0

Doh - thanks :) –

1
string[] s = new string[] { "all","in","all"}; 

et sa version abrégée

string[] s = {"all","in","all"}; 

sont la même chose. Voir MSDN (section Initializing Arrays) pour plus de détails.

1

La partie {"all","in","all"} est l'initialisation. la partie new string[] peut être omise car les accolades et les cordes sont des annotations abrégées. Jetez un oeil à MSDN sur les tableaux à une dimension.

+0

ah. Bon à savoir. Je l'ai toujours fait explicitement. – el2iot2

3

Il est possible de déclarer une variable de tableau sans initialisation.

Check this out http://msdn.microsoft.com/en-us/library/0a7fscd0%28VS.71%29.aspx

+1

déclarer un tableau sans initialisation serait juste 'string [] s' l'exemple ci-dessus fournit des valeurs avec lesquelles la chaîne est initialisée. – Bob

+0

l'exemple ci-dessus fournit des valeurs que la chaîne * array * est initialisée avec – Bob

2

Je pense que vous voulez savoir pourquoi

string[] s={"all","in","all"}; 

fonctionne quand vous attendez à être nécessaire pour initialiser le tableau d'abord comme ceci:

string[] s = new string[]; 

ou

string[] s = new string[] {"all","in","all"}; 

La réponse est juste la magie du compilateur. Le compilateur sait, en fonction de l'initialisation, quelle est la taille du tableau, donc il le fait dans les coulisses pour vous. Tout comme le mot-clé var, le but est de limiter la quantité d'informations redondantes que vous devez taper.

+0

Est-ce que cette relaxation est uniquement pour les tableaux? Pesron a = {Nom = "nom de famille"} ?? – user193276

3

Vous n'êtes pas "en train d'affecter une valeur au tableau". Vous initialisez une variable de type "reference to array". La valeur avec laquelle vous l'initialisez est une référence à un tableau qui a été créé par l'utilisation de la syntaxe d'initialisation de short array {...}. Bien qu'il ne soit autorisé que dans l'initialiseur de variables de type tableau, il est exactement équivalent à new T[] { ... }, où T est déduite du type de variable.

1

Vous n'avez pas besoin la nouvelle chaîne [] partie en C# 3 ou plus - cela fonctionne bien

string[] s = { "all","in","all"}; 

Il est juste un cas du compilateur d'être un peu plus intelligent et travailler ce que vous voulez dire - l'arrière IL sera le même.

1

Vous pouvez le faire simplement parce que c'est autorisé, cela n'est pas nécessaire en deux étapes, donc c'est le raccourci. Considérez cela comme du sucre.

Questions connexes