【问题标题】:FxCop is confusing on how to eliminate the redundant castclassFxCop 对如何消除多余的演员阵容感到困惑
【发布时间】:2012-01-01 21:59:01
【问题描述】:

我正在尝试解决一些 fxcop 问题,但我对这个问题感到非常困惑。

在派生类的 setter 中,我正在检查是否应该进行赋值

if (!(value is TypeA))
{
    throw new ArgumentException("value is not of TypeA type");
}

_action = (TypeA)value;

FxCop 抱怨:

'value',一个参数,在方法中被多次转换为类型'TypeA'。缓存 'as' 运算符的结果或直接转换,以消除多余的 castclass 指令。

但是,在this msdn 示例中(is 定义)我看到了这个:

if (o is Class1)
{
    Console.WriteLine("o is Class1");
    a = (Class1)o;
}

这和我做的完全一样。那么,有解决方案吗?

我能想到的是:

TypeA tmpAction = value as TypeA;
if(tmpAction == null)
{
    throw new ArgumentException();
}

_action = tmpAction;

【问题讨论】:

  • 是的,你的想法是正确的。你觉得这有什么问题?
  • 我很困惑这是否正确,因为 msdn 和我做的一样
  • 在 MSDN 上有许多不被视为最佳实践的示例。有些是故意保持简单,可能是跳过输入验证。
  • 是的,并非您在 MSDN 上看到的所有内容都符合 FxCop 的建议。代码的第一个 sn-p 本身并没有错误,FxCop 只是告诉你有一个更好的 方法可以做到这一点。

标签: c# casting fxcop


【解决方案1】:
TypeA tmpAction = value as TypeA;
if(tmpAction == null)
{
    throw new ArgumentException();
}

您给出的示例是正确的 - 如果您需要转换并使用您转换为类型的变量,请使用 asnull 检查而不是 is 这样您就不必这样做两次。

【讨论】:

    【解决方案2】:

    使用as 运算符的解决方案是您应该做的。请注意,如果TypeA 是值类型,则不能这样做,as 仅适用于引用类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      相关资源
      最近更新 更多