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