2010-06-29 4 views
6

Итак, у меня есть этот отличный код от Microsoft, и у меня есть небольшая икота, от которой я хочу избавиться.Переменная 'x' объявлена, но никогда не используется.

Исходный код распечатывает исключение 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); 
+5

Просто уточнить, это предупреждение, а не ошибка, исправить? – Robaticus

+3

@Robaticus - если вы не включаете предупреждения как ошибки; p –

+0

Oh snap! Но, да, я был неправ, чтобы назвать это ошибкой, а не предупреждением. – sooprise

ответ

22

Компилятор прав; она точно так же может быть:

catch (ChangeConflictException) 
{ 
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts) 
    { 
     occ.Resolve(RefreshMode.KeepChanges); 
    } 
} 

который ограничивает исключения, которые входят в этот блок, но делает не объявить переменную для него. Эта переменная полезна, если вы хотите, чтобы проверял значение, регистрировать его или переносить в другое исключение. Только для полноты (не применимо здесь) обычно повторный бросок должен быть throw;, неthrow x; (для сохранения следа стека).

+0

Хорошо, я подозревал, что вы можете удалить «x», но код слишком сложный для меня, чтобы сказать, вызвало ли оно какие-либо существенные изменения. Спасибо! – sooprise

3

Хотя в этом случае вы можете просто избавиться от переменной «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 об условном атрибута: «Вызовы условного метода либо включены или опущены в зависимости от того, определен ли данный символ в точке вызова Если символ определен, вызов включен. , в противном случае вызов (включая оценку параметров вызова) опускается ».

+0

Вы также можете сделать это: 'x = x'. –

+4

@Loadmaster: Просьба объяснить классу, как избавиться от «неиспользуемого локального» предупреждения, заменив его «локальным назначается», предупреждение является улучшением. –

+0

Ум, хорошо, я не думал, что компилятор поймает это. –

1
#pragma warning disable 0168 

catch (ChangeConflictException x) 
{ 
    // code here 
} 

#pragma warning enable 0168 
Смежные вопросы