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

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

Я не хочу отключать глобальное предупреждение всегда true / false.потому что это может указывать на проблему в коде.В то же время необходимость загромождать мой код комментариями 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 ]

2 голосов
/ 23 ноября 2011

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

  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());

    }

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

0 голосов
/ 04 января 2012

Вместо этого можно попробовать Debug.Fail():

if (button != null)
    button.Visible = ( schedule.CreatedBy == Authentification.GetLoggedInUser() );
else
    Debug.Fail("Button was not found");
...