如果为C#编译器分配了属性,它是否会删除未使用的本地?

时间:2013-05-03 09:38:14

标签: c# optimization compiler-construction

这可能是一个愚蠢的问题。我知道编译器将删除未使用的本地。但是,如果我像这样编写代码:

class MyClass
{
    public int SomeProperty
    {
        get
        {
          ...
        }
    }

    public void SomeFunction ()
    {
       //will this line be removed if i is never used?
       int i = SomeProperty;
       ...
    }
}

我想知道如果i由于优化而被编译器删除。我希望执行SomeProperty的getter中有逻辑。如果i将被删除,我必须将SomeProperty更改为函数。

顺便问一下,有没有办法知道哪一行会被编译器优化?

1 个答案:

答案 0 :(得分:9)

我建议编译器所做的并不重要。这是糟糕的设计。

如果调用吸气剂有重要的副作用,那么它应该不是吸气剂。吸气剂应该做的最多就是懒惰初始化的东西,这不应该是重要的,因为如果它没有发生,它只会通过下一步来完成它。

我不知道你在做什么,但它可能应该重构为自己的方法,可以在那时明确调用。

另一个主要问题与可读性有关。当int i = SomeProperty;从未再次使用时看到行i的任何人都可能会认为该行没有意义并且什么都不做,因此将其从代码中删除,从而导致出现任何意外错误。你最好调用像LogicExtractedFromProperty()这样的方法,这样很明显你在做什么。

编译器可能(或可能不会,我不知道或不关心)做正确的事,但一个人可能不会。