Хорошо, таким образом, у меня есть этот изящный бит кода от Microsoft, и у меня есть немного отклонения, от которого я хочу избавиться.
Исходный код распечатывает ChangeConflictException x на консоли, но я стер эту строку. Теперь, каждый раз, когда я использую этот бит кода, я получаю ошибку: "Переменная 'x' объявляется, но никогда не используется".
Что самый эффективный путь состоит в том, чтобы избавиться от этой ошибки при сохранении функциональности кода?
//See http://msdn.microsoft.com/en-us/library/bb386918.aspx
try
{
DB.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException x)
{
foreach (ObjectChangeConflict occ in DB.ChangeConflicts)
{
occ.Resolve(RefreshMode.KeepChanges);
}
}
// Submit succeeds on second try.
DB.SubmitChanges(ConflictMode.FailOnFirstConflict);
Компилятор прав; с таким же успехом это может быть:
catch (ChangeConflictException)
{
foreach (ObjectChangeConflict occ in DB.ChangeConflicts)
{
occ.Resolve(RefreshMode.KeepChanges);
}
}
, который ограничивает исключения, которые входят в этот блок, но не объявляет для него переменную. Переменная полезна, если вы хотите проверить значение, зарегистрировать его или заключить в другое исключение. Для полноты (здесь не применяется) обычно повторный бросок должен быть throw;
, не throw x;
(чтобы сохранить стек -след).
Хотя в этом случае вы можете просто избавиться от переменной 'x' (как упоминал Марк). Как правило, для сценариев, когда у меня есть эти предупреждения, и я не могу изменить код (например, используя некоторые поля путем отражения), я обычно предпочитаю делать ничего не делать вызова метода условной компиляции, который подавляет такие раздражающие предупреждения.
Код ниже.
catch (ChangeConflictException x)
{
DoNothingWith(x);// This suppress the 'x' not used warning
foreach (ObjectChangeConflict occ in DB.ChangeConflicts)
{
occ.Resolve(RefreshMode.KeepChanges);
}
}
[Conditional("Debug")]
public static void DoNothingWith(object obj){
}
Ссылка из MSDN по поводу условного атрибута: "Вызов условного метода либо включаются, либо опускаются в зависимости от того, определен ли этот символ в точке вызова. Если символ определен, вызов включается; в противном случае вызов (включая оценку параметров вызова) опущено ".