我可能会在这里得到一些反对票,但实际上我已经通过正常的搜索找到了相互矛盾的信息,我希望其他人也能很容易找到一个明确的答案。
给定当前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()。
他在胡说八道。分配的实例永远不会被垃圾回收,不管它是从哪里分配的。