Объем переменной без параметра

Пример:

У меня есть следующий блок кода:

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

Console.WriteLine(parsedNumber);

Вывод в консоли: 123

Вопрос:

Как это возможно, что строка Console.WriteLine(parsedNumber); знает о parsedNumber?

Насколько я понимаю, parsedNumber должен быть доступен только в if-block, не так ли?

Если я попробую это:

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

Console.WriteLine(data);

Console.WriteLine(data); не может найти data.


Я думаю, что решение - это параметр out, но я не уверен. Кто-нибудь может это объяснить?


person Sean Stayns    schedule 08.07.2017    source источник


Ответы (2)


Да, как вы догадываетесь, разница в модификаторе "out".

Это функция, добавленная в C # 7, которая позволяет вам объявить переменную в том месте, где вы хотите использовать ее в качестве аргумента.

Это может быть удобно, иначе вам пришлось бы объявить parsedNumber перед вызовом метода.

Вы можете прочитать об этом здесь, в разделе «Выходные переменные».

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

ИЗМЕНИТЬ

Что касается того, почему переменная все еще находится в области действия за пределами if, это, безусловно, может сбивать с толку, но это был выбор дизайна при реализации этого, особенно для случая «if» и именно для того, чтобы ее можно было использовать в методах «try». .

Вы можете сослаться на этот комментарий (на самом деле вы можете взглянуть на все обсуждение, чтобы увидеть различные точки зрения на то, как это реализовать).

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

person eugenioy    schedule 08.07.2017
comment
Я думаю, он / она спрашивает, почему из if () {} мы все еще можем получить доступ к parsedNumber - person FullStackDeveloper; 08.07.2017
comment
@CodeContributor: да, это тоже имеет смысл, добавил РЕДАКТИРОВАТЬ к моему ответу, чтобы покрыть это - person eugenioy; 08.07.2017

До C # 7.0

ключевое слово out использовалось для передачи ссылки на аргумент метода. Прежде чем переменная будет передана как выходной аргумент, она должна быть объявлена.

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

Console.WriteLine(parsedNumber); 

В C # 7.0

вы можете определить выходные параметры метода прямо в методе. Новый код выглядит так

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

Console.WriteLine(parsedNumber); 

Ссылка :

Что нового -csharp-7-0

person Azar Shaikh    schedule 08.07.2017