使用函数调用时,C#6.0的默认属性值如何分配并受范围影响?

CDo*_*ove 4 c# garbage-collection c#-6.0

我可能会在这里得到一些downvotes,但我实际上通过正常搜索发现了相互矛盾的信息,并希望得到其他人也能轻易找到的确定答案.

给出当前C#中的属性:

public static IEnumerable<string> foo { get; set; } = new string[] { "bar", "bar2" };
Run Code Online (Sandbox Code Playgroud)

我们知道默认值foo将返回上面的数组.如果指定了其他值,则不再使用默认值.但是,如果案例是:

public static IEnumerable<string> foo { get; set; } = GetMyStrings();
Run Code Online (Sandbox Code Playgroud)

我的想法是这个功能如下:

if(foo == null) { foo = GetMyStrings();}
Run Code Online (Sandbox Code Playgroud)

并且foo将保留从GetMyStrings()对象生命周期的第一次运行开始的值,除非被手动赋值.

我的同事坚持认为这可能是一个GC问题,并且结果GetMyStrings()会超出范围并被收集,"重新整理"参数并GetMyStrings()在对象的生命周期内引起多次调用.

我们哪个是正确的?

Pat*_*man 5

不,实际上是这样的:

static ClassName()
{
    foo = GetMyStrings();
}
Run Code Online (Sandbox Code Playgroud)

编译器生成一个静态构造函数并将赋值调用放在那里(就像它在构造函数中为非静态属性创建一行).

我的同事坚持认为这可能是一个GC问题,并且GetMyStrings()的结果可能超出范围并被收集,"重新整理"参数并在对象的生命周期内导致多次调用GetMyStrings().

他在胡说八道.无论从何处分配实例,分配的实例都不会被垃圾回收.