【问题标题】:FXCop casting WarningFXCop 铸造警告
【发布时间】:2010-03-03 09:52:28
【问题描述】:

运行 FXCop 时出现以下错误:

CA1800:Microsoft.Performance: 'obj',一个变量,被强制转换为类型 在方法中多次“工作” 'ProductsController.Details(int, 整数)'。缓存'as'的结果 运算符或直接强制转换,以便 消除多余的演员表 说明

代码:

        object obj = repository.GetJobOrPlace(jobId);//Returns  (object) place or (object) product

        if (obj != null)
        {
            if (obj is Job)
            {
                Job j = (Job) obj;
                Debug.WriteLine(j.Title);
            }
            else if (obj is Place)
            {
                Place p = (Place) obj;
                Debug.WriteLine(p.Title);
            }
        }

这有什么问题?我只能看到一个演员表:Job j = (Job) obj。

【问题讨论】:

  • 就 .NET 而言,“is”运算符也是一个强制转换。

标签: c# fxcop


【解决方案1】:

只有一个演员,但也有一个测试。因此,您可以将第一个块替换为:

Job j = obj as Job;
if (j != null)
{
    Debug.WriteLine(j.Title);
}

这意味着执行时间测试只需要执行一次,而不是两次。这是一个微优化 - 在你的情况下,它会使代码有点混乱,正如你所需要的:

Job j = obj as Job;
if (j != null)
{
    Debug.WriteLine(j.Title);
}
else
{
    Place p = obj as Place;
    if (p != null)
    {
        Debug.WriteLine(p.Title);
    }
}

(或者更早声明和初始化p,如果obj实际上是Job,这会浪费测试...)

【讨论】:

  • 一个小细节:第一行应该是“Job j = obj as Job;” Job 中的 J 大写。
  • 次要的挑剔:“作为工作”应该是“作为工作”;-)
  • 该死,安德斯打败了我:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多