需要 'CA1800: Do not cast unnecessarily' 的解释

Explanation of 'CA1800: Do not cast unnecessarily' needed

我对 Visual Studio 中的代码分析警告有点困惑。以下代码引发它:

static void Main(string[] args)
{
    var something = new Something();
    object expression = "Any value";
    for (int i = 0; i < 2; i++)
    {
        switch (i)
        {
            case 0:
                something.Help = expression as string;
                break;

            case 1:
                something.Description = expression as string;
                break;
        }
    }
}

class Something
{
    public string Help;
    public string Description;
}

documentation of CA1800 说:

... Duplicate casts decrease performance, especially when the casts are performed in compact iteration statements. For explicit duplicate cast operations, store the result of the cast in a local variable and use the local variable instead of the duplicate cast operations. ...

我可以使用和分配局部变量,是的。但是上面显示的转换不会在一次迭代中执行。所以,在我看来,这不会比使用局部变量更昂贵。

在我的真实方法中,变量 expression 可以有许多其他类型和其他类型的 class Something 属性。还有一个参数,它替换了 i 并且没有 for-loop.

假设我为 expression 的任何可能类型创建了一个局部变量。然后将执行许多转换操作,而只需要一个。

for (int i = 0; i < 2; i++)
{
    var type1 = expression as Type1;
    var type2 = expression as Type2;
    var type3 = expression as Type3;
    var type4 = expression as Type4;
    switch (i)
    {
        case 0:
            something.*** = type1;
            break;

        case 1:
            something.*** = type2;
            break;

        ...
    }
}

太贵了...

有人能告诉我这个警告的背景吗?这对我来说没有任何意义。

该警告表明您因为循环而进行了多次投射。这应该可以解决它:

var something = new Something();
object expression = "Any value";
string expressionAsString = expression as string;
for (int i = 0; i < 2; i++)
{
    switch (i)
    {
        case 0:
            something.Help = expressionAsString;
            break;

        case 1:
            something.Description = expressionAsString;
            break;
    }
}

也就是说,正如 Servy 提到的那样,警告就是警告 - 如果您的代码通过多次强制转换更容易理解并且它不会显着影响性能(只能确定通过尝试两种方式并测量差异)然后忽略或抑制警告。我看过太多丑陋的代码 and/or 难以理解,只是为了避免警告 不理解代码的上下文