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

问题描述 投票:0回答:1

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

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
更改为函数。

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

c# optimization
1个回答
9
投票

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

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

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

另一个主要问题与可读性有关。当

int i = SomeProperty;
不再使用时,任何看到
i
行的人很可能会认为该行毫无意义并且什么也不做,因此将其从代码中删除,从而导致出现任何意外错误。您最好调用像
LogicExtractedFromProperty()
这样的方法,这样很明显您正在做某事。

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

© www.soinside.com 2019 - 2024. All rights reserved.