gpt4 book ai didi

c# - 使用函数调用时,C# 6.0 默认属性值如何分配并受作用域影响?

转载 作者:太空狗 更新时间:2023-10-30 01:00:48 24 4
gpt4 key购买 nike

我可能会在这里得到一些反对票,但实际上我通过正常搜索发现了冲突信息,并且希望得到其他人也可以轻松找到的明确答案。

给定当前 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();
}

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

My colleague insists this risks a GC problem, and that the result of GetMyStrings() can fall out of scope and be collected, "renullifying" the parameter and causing multiple calls to GetMyStrings() over the lifetime of the object.

他在胡说八道。分配的实例永远不会被垃圾回收,无论它是从哪里分配的。

关于c# - 使用函数调用时,C# 6.0 默认属性值如何分配并受作用域影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43495419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com