Убедить компилятор C# в том, что выполнение прекратится после возвращения членаC#

Место общения программистов C#
Ответить
Anonymous
 Убедить компилятор C# в том, что выполнение прекратится после возвращения члена

Сообщение Anonymous »

Я не думаю, что в настоящее время это возможно или вообще хорошая идея, но я только что об этом думал. Я использую MSTest для модульного тестирования моего проекта C#. В одном из своих тестов я делаю следующее:

Код: Выделить всё

MyClass instance;

try
{
instance = getValue();
}
catch (MyException ex)
{
Assert.Fail("Caught MyException");
}

instance.doStuff(); // Use of unassigned local variable 'instance'
Чтобы этот код скомпилировался, мне нужно присвоить значение экземпляру либо в его объявлении, либо в блоке catch. Альтернативно я мог бы вернуться после Assert.Fail, но это все равно обходной путь вместо того, чтобы компилятор просто знал, что выполнение не может продолжаться после этого момента. Насколько мне известно, Assert.Fail никогда не позволит продолжить выполнение, поэтому экземпляр никогда не будет использоваться без значения. Почему же тогда я должен присвоить ему значение? Если я изменю Assert.Fail на что-то вроде throw ex, код компилируется нормально, я предполагаю, потому что он знает, что исключение не позволит продолжить выполнение до точки, где будет использоваться экземпляр. неинициализирован.

А что, если я не хочу, чтобы тест провалился, а был помечен как неубедительный? Я мог бы выполнить Assert.Inconclusive вместо Fail, и было бы неплохо, если бы компилятор знал, что после этого выполнение не продолжится.

Так является ли это случаем знания времени выполнения и времени компиляции о том, где будет разрешено продолжить выполнение? Будет ли когда-нибудь разумно для C# иметь какой-то способ сказать, что член, в данном случае Assert.Fail, никогда не разрешит выполнение после своего возврата? Возможно, это могло бы быть в форме атрибута метода. Будет ли это полезно или будет ненужной сложностью для компилятора?

Вне модульных тестов

Поскольку люди [обоснованно] отмечают, что это глупый способ написания модульного теста, рассмотрите мой вопрос за пределами области модульного тестирования:

Код: Выделить всё

MyClass instance;

if (badThings)
{
someMethodThatWillNeverReturn();
}
else
{
instance = new MyClass();
}

instance.doStuff();
Здесь потенциально я мог бы заменить вызов someMethodThatWillNeverReturn выдачей исключения, и, возможно, если бы мне нужно было что-то сделать, я мог бы сделать это в конструкторе для исключение.

Resharper знает

Если я добавлю возврат после Assert.Fail или Assert.Inconclusive цвета Resharper возвращаются серыми и имеют всплывающую подсказку с надписью «Код эвристически недостижим».

Подробнее здесь: https://stackoverflow.com/questions/251 ... er-returns
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»