我可能会在这里得到一些反对票,但实际上我已经通过正常的搜索找到了相互矛盾的信息,我希望其他人也能很容易找到一个明确的答案。
给定当前c中的属性:

public static IEnumerable<string> foo { get; set; } = new string[] { "bar", "bar2" };

我们知道默认值foo将作为上述数组返回。如果分配了另一个值,则不再使用默认值。但是,如果情况是:
public static IEnumerable<string> foo { get; set; } = GetMyStrings();

我的想法是这样的:
if(foo == null) { foo = GetMyStrings();}

并且,除非被手动分配的值覆盖,否则foo将在对象的生存期内保留第一次运行GetMyStrings()时的值。
我的同事坚持认为这可能是一个gc问题,GetMyStrings()的结果可能会超出范围并被收集,GetMyStrings()的参数会被“重新提取”,并在对象的生命周期内多次调用。
我们谁是对的?

最佳答案

不,实际上是这样的:

static ClassName()
{
    foo = GetMyStrings();
}

编译器生成一个静态构造函数并将赋值调用放在其中(就像它在构造函数中为非静态属性创建一行一样)。
我的同事坚持认为这有可能导致gc问题,getmystrings()的结果可能超出范围并被收集,“重新充实”参数,并在对象的生命周期内多次调用getmystrings()。
他在胡说八道。分配的实例永远不会被垃圾回收,不管它是从哪里分配的。

09-13 11:14