17

我正在使用腰带和吊带类型检查潜在的空对象问题。不过,Resharper 的表现并不好。在调试版本中,它if (button != null)会将检查标记为始终为真,并在侧边栏中放置一个警告标记。在发布版本中,它遮蔽了Debug.Assert从未使用过的代码,尽管至少它足够聪明,这次不会弄乱侧边栏。

我不想全局禁用总是 true/false resharper 警告,因为它可以指示代码中的问题。同时,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() );
4

2 回答 2

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

    }

希望有帮助。

于 2011-11-23T18:00:51.243 回答
0

您可以尝试Debug.Fail()改用:

if (button != null)
    button.Visible = ( schedule.CreatedBy == Authentification.GetLoggedInUser() );
else
    Debug.Fail("Button was not found");
于 2012-01-04T07:18:11.453 回答