Производительное преимущество оператора сброса - PullRequest
2 голосов
/ 02 мая 2020

Допустим, у меня есть это в моем приложении C#:

try{
    Somethrowingmethod();
}catch(Exception ex){
    throw new Exception("oops");
}

Если я оставлю свой код таким, какой он есть, компилятор (по праву так) будет жаловаться на то, что я объявляю ex, но не использую его.

Поэтому я должен вместо этого сделать это:

try{
    Somethrowingmethod();
}catch(Exception _){
    throw new Exception("oops");
}

Мой вопрос: есть ли прирост производительности после того, как я это сделаю?

Или это только для практики чистого кода?

Ответы [ 2 ]

3 голосов
/ 03 мая 2020

Ваш вопрос некорректен, так как в вашем примере нет сбрасываний. Вместо этого он называет переменную Exception _ и все равно должен выдать то же предупреждение для неиспользуемой переменной. Посмотрите этот пример SharpLab и посмотрите предупреждение и .locals init сгенерированного IL.

.locals init (
  [0] class [System.Private.CoreLib]System.Exception
)

Правильный способ "отбросить" исключение - перехватить только тип :

try {
  DoSomething();
} catch (Exception) {
  //... 
} 

Это не объявляет локальную переменную, которую вы можете проверьте по приведенной выше ссылке, просто стерев _ и просмотрев обновленный раздел .locals init (подсказка: его больше нет).

Так как это перехватывает базовый тип исключения, вы также можете переписать его следующим образом:

try {
  DoSomething();
} catch {
  //... 
} 

Обратите внимание, что это , как правило, плохая идея, чтобы поймать все / поймать базовый Exception тип.

Вернемся к исходному запросу: ни в одном из этих сценариев не наблюдается прироста производительности ios. В лучшем случае переменная удаляется, но true сброс - это просто syntacti c сахар, и переменная по-прежнему объявляется. Этот код:

int.TryParse("1", out _);

все еще включает локальную переменную типа int. Вы можете увидеть это, просмотрев тот же раздел IL .

.locals init (
  [0] int32
)

Но опять же, прирост производительности отсутствует.

2 голосов
/ 03 мая 2020

или просто сделайте это

try{
    Somethrowingmethod();
}catch(Exception){
    throw new Exception("oops");
}

, но разницы в производительности нет

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