2017-07-08 1 views
1

Exemple:Portée des variables avec des paramètres

je le bloc de code suivant:

if (!int.TryParse("123", out var parsedNumber)) 
{ 
    return; 
} 

Console.WriteLine(parsedNumber); 

La sortie de la console est: 123

Question:

Comment est-il possible que la ligne Console.WriteLine(parsedNumber); connaisse parsedNumber? Selon ma compréhension, parsedNumber devrait seulement disponible dans le if-block, n'est-ce pas?

Si j'essaie ceci:

foreach (var data in dataList) 
{ 
    data += "something"; 
} 

Console.WriteLine(data); 

Console.WriteLine(data); ne peut pas trouver data. Je pense que la solution est le paramètre out, mais je ne suis pas sûr. Quelqu'un peut-il expliquer cela?

Répondre

2

Oui, car vous pensez que la différence est ce modificateur "out".

C'est une fonctionnalité ajoutée en C# 7 qui vous permet de déclarer la variable à l'endroit où vous voulez l'utiliser comme argument.

Cela peut être pratique car sinon vous devrez déclarer parsedNumber avant l'appel de la méthode.

Vous pouvez lire plus à ce sujet ici, sous "Variables de sortie".

https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

EDIT

Quant à savoir pourquoi la variable est toujours portée en dehors du cas, qui peut certainement être source de confusion, mais ce fut un choix de conception lors de l'exécution du présent, en particulier pour la " si "cas et précisément de sorte qu'il pourrait être utilisé dans" essayer "des méthodes.

Vous pouvez vous référer à ce commentaire (en fait, vous pouvez jeter un oeil à toute la discussion pour voir les différents points de vue sur la façon de l'implémenter).

https://github.com/dotnet/roslyn/issues/12939#issuecomment-255650834

+1

Je pense ce qu'il/elle demande que pourquoi de si() {}, on peut encore accéder à parsedNumber – EntryLeveDeveloper

+0

@CodeContributor: oui, cela a du sens aussi, ajouté un EDIT à ma réponse pour couvrir cela – eugenioy

+0

Merci pour cette bonne explication. –

2

Avant C# 7.0

le mot-clef a été utilisé pour passer la référence d'un argument de méthode. Avant qu'une variable ne soit passée en argument out, elle doit être déclarée.

var parsedNumber; 
if (!int.TryParse("123", out var parsedNumber)) 
{ 
    return; 
} 

Console.WriteLine(parsedNumber); 

En C# 7.0

vous pouvez définir les paramètres d'une méthode sur directement dans la méthode.Le nouveau code ressemble

if (!int.TryParse("123", out var parsedNumber)) 
{ 
    return; 
} 

Console.WriteLine(parsedNumber); 

Référence:

Whats-new-in-csharp-7-0

+0

Merci pour votre exemple –