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

Xin*_*hao 6 c# compiler-construction optimization

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

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

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

我想知道如果i由于优化将被编译器删除.SomeProperty我希望执行的getter中有逻辑.如果i将被删除,我必须更改SomeProperty为一个功能.

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

Chr*_*ris 9

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

如果调用getter有重要的副作用,那么它应该不是一个吸气剂.最大的吸气剂可能应该做的是懒惰初始化的东西,这不应该是重要的,因为如果它没有发生它只会通过下一件事来完成它.

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

另一个主要问题涉及可读性.任何人看到线int i = SomeProperty;时,i决不会再次使用可能决定该行是没有意义的,什么也不做,因此从代码造成任何出现意外错误删除它.你最好调用一个类似的方法LogicExtractedFromProperty(),这显然是你正在做的事情.

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