Отключить повторные предупреждения, которые зависят от типа сборки

Я использую проверку типов ремней и подтяжек на предмет возможных проблем с нулевым объектом. Решарпер играет не очень хорошо, хотя. В отладочной сборке он отмечает if (button != null) отметьте как всегда true и поставьте предупреждающий маркер на боковой панели. В сборке релиза он затеняет Debug.Assert никогда не использовал код, хотя, по крайней мере, он достаточно умен, чтобы на этот раз не загромождать боковую панель.

Я не хочу отключать глобальное предупреждение всегда истина / ложь, потому что это может указывать на проблему в коде. В то же время необходимость загромождать мой код ReSharper disable/restore ConditionIsAlwaysTrueOrFalse комментарии каждый раз, когда я делаю проверку, ужасны.

Есть ли где-то в ReSharper 5.1 опция для отключения условного поведения типа сборки, чтобы if не отмечалось в отладочных сборках, не предотвращая отображение предупреждения, если Assert нет?

//This should always work unless the columns are fiddled with.
LinkButton button = e.Row.Cells[5].FindControl( "linkButtonName" ) as LinkButton;

//if this isn't the case in a debug build have VS throw an error in the devs face
Debug.Assert(button != null);

//Don't let anything go boom in production if an error isn't caught in dev
if (button != null)
    button.Visible = ( schedule.CreatedBy == Authentification.GetLoggedInUser() );

2 ответа

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

  1. Установите контракты кода от http://research.microsoft.com/en-us/projects/contracts/
  2. Переписать ваши Debug.Asserts в Contract.Assert
  3. Затем измените свойства проекта, чтобы проверять только контракты в отладочной сборке.

Таким образом, кажется, что вашу проблему легче всего решить, заменив debug.assert следующим:

  //Throw an error only if there is a problem with 
  Contract.Assert(button!=null);

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

Таким образом, ваш код выше будет:

    public void MyMethod(EventArgs e)
    {

            var button = e.Row.Cells[5].FindControl("linkButtonName") as LinkButton;
            SetButtonVisibility(button);
    }

    public void SetButtonVisibility(LinkButton button)
    {
        //The button is never null so its a contract
        Contract.Requires<ArgumentNullException>(button != null);

        button.Visible = (schedule.CreatedBy == Authentification.GetLoggedInUser());

    }

Надеюсь, это поможет.

Вы можете попробовать использовать Debug.Fail() вместо:

if (button != null)
    button.Visible = ( schedule.CreatedBy == Authentification.GetLoggedInUser() );
else
    Debug.Fail("Button was not found");
Другие вопросы по тегам