Короткое замыкание с TryParse () и переменная надежна? - PullRequest
0 голосов
/ 12 мая 2018

Эта тема много раз обсуждалась и ясно: Безопасно ли полагаться на && безопасное короткое замыкание в .NET?

Что я не могу найти, так это четкий ответ, если короткое замыканиетакже надежно, когда параметр out используется в правой части предложения if:

int foo;
....
if ( false == Int32.TryParse( bar, out foo ) || 0 == foo )

Когда я пытаюсь использовать этот код, он работает.Но я немного беспокоюсь, если поведение будет надежным, потому что я не знаю, как компилятор переводит код и получает доступ к foo.

Мой вопрос:

Действительно ли доступ к foo действительно сделан после TryParse, который учитывает любое измененное значение, или компилятор может иногда читать значение до TryParse [из-за некоторых оптимизаций] и поэтому я не могу полагаться на этот код.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Вы можете проверить это, используя новые языковые функции в C #:

if (!int.TryParse("0", out int foo) || foo == 0)
{
    //foo == 0 or the tryparse failed
    //foo still exists here though, so if it fails, it will still == 0
}

Вы можете видеть, что объявление foo происходит внутри вызова int.TryParse, что не произошло бы, если бы foo == 0 вычислялся первым. Это допустимый синтаксис в C # 7 и выше. На самом деле это все синтаксический сахар для этого:

int foo = 0   
if (!int.TryParse("0", out foo) || foo == 0)
{
    //foo == 0 or the tryparse failed
}
0 голосов
/ 12 мая 2018

Действительно ли доступ к foo осуществляется после TryParse, который рассмотреть любое измененное значение

Да, это будет так.

или компилятор может иногда прочитать значение перед TryParse [потому что некоторых оптимизаций], и поэтому я не могу полагаться на этот код.

Нет, он не будет читать foo до вызова Int32.TryParse; один из них заключается в том, что логическое ИЛИ всегда будет оценивать левую сторону, а только оценивает правую сторону, если это необходимо. во-вторых, он не будет сначала оценивать правую сторону, потому что переменная foo не инициализируется в этой точке, что может привести к ошибке компиляции (при условии, что это локальная переменная).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...