【问题标题】:In c#, does object initialization syntax happen before assignment?在c#中,对象初始化语法是否发生在赋值之前?
【发布时间】:2013-09-20 16:46:36
【问题描述】:

在c#中,对象初始化如下:

var thing = new List<object>() {new object()};

发生在赋值之前,所以大致相当于:

var _thing = new List<object>();
_thing.Add(new object());
var thing = _thing;

或者是在赋值之后发生,所以和以下差不多:

var thing = new List<object>();
thing.Add(new object());

如果您试图在工厂中打一个递归结,这会有所不同:

static class AbstractFactory {
    private static readonly IEnumerable<object> _list = new List<object>() {GetIEnumerable()};

    public static IEnumerable<object> GetIEnumerable() {
        return _list;
    }
}

当在_list 的初始化程序中调用该方法时,如果从GetIEnumerable 返回_list,它将是new List&lt;object&gt;null 还是未定义?

【问题讨论】:

  • 你为什么不在那里执行你自己的代码 sn-p 并自己找出来?
  • 请注意,您的使用示例非常奇怪 - 假设它只是作为示例......否则非常不清楚人们应该从该代码中得到什么结果。也许你的意思是_list = new List&lt;object&gt;(Enumerable.Empty&lt;object&gt;())
  • @AlexeiLevenkov 显然,这是一个人为的示例,它只是设计为一些代码示例,根据此操作的确切语义会采取不同的行动。在绝大多数情况下,这无关紧要。在重要的地方找到一个非人为的例子是可能的,但要困难得多。这里没有错。
  • @AlexeiLevenkov List&lt;&gt; 只是我们都熟悉的对象。 GetIEnumerable() 是包含自身的 List&lt;&gt; 还是包含 nullList&lt;&gt;
  • @Cirdec 我倾向于回答,但鉴于您已经完成了 95% 的工作,我很惊讶您不仅运行了自己的完整代码示例并查看了你自己。有两个合理的结果,根据您看到的结果,您可以确定使用了哪种行为,或者至少有一些非常强烈的迹象。

标签: c# recursive-datastructures object-initialization


【解决方案1】:

它编译为第一个示例,即object initialization occurs before assignment

您可以使用.Net Reflector 查看编译后的版本。它编译到这个(使用反射器提取) -

List<object> <>g__initLocal0 = new List<object>();
<>g__initLocal0.Add(new object());
List<object> thing = <>g__initLocal0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 2010-10-22
    • 1970-01-01
    • 2013-05-07
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多