6

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

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

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

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

顺便说一句,有没有办法知道编译器会优化哪一行?

4

1 回答 1

9

我建议编译器做什么并不重要。这是一个糟糕的设计。

如果调用 getter 有重要的副作用,那么它可能不应该是 getter。getter 最应该做的就是懒惰地初始化某些东西,这不应该是重要的,因为如果它没有发生,它只会被下一个得到它的东西完成。

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

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

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

于 2013-05-03T10:18:08.467 回答