两者之间有什么区别?何时使用"对象初始值设定项"而不是"构造函数",反之亦然?我正在使用C#,如果这很重要的话.另外,对象初始化方法是否特定于C#或.NET?
我注意到具有必需和方法的新ExpandoObject工具因此应该可以使用集合初始化语法以与向字典添加项目相同的方式向expando对象添加属性.IDictionary<string,object>IEnumerable<KeyValuePair<string, object>>Add(string, object)
Dictionary<string,object> dict = new Dictionary<string,object>()
{
{ "Hello", "World" }
};
dynamic obj = new ExpandoObject()
{
{ "foo", "hello" },
{ "bar", 42 },
{ "baz", new object() }
};
int value = obj.bar;
Run Code Online (Sandbox Code Playgroud)
但似乎没有办法做到这一点.错误:
'System.Dynamic.ExpandoObject'不包含'添加'的定义
我认为这不起作用,因为接口是明确实现的.但有没有办法解决这个问题?这工作正常,
IDictionary<string, object> exdict = new ExpandoObject() as IDictionary<string, object>();
exdict.Add("foo", "hello");
exdict.Add("bar", 42);
exdict.Add("baz", new object());
Run Code Online (Sandbox Code Playgroud)
但是集合初始化器语法更整洁.
我刚刚学习了对象初始化器,并想知道什么时候使用它们的最佳实践.
这是我读到的关于它们的内容:http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx 它清楚地表明它们是创建匿名类型所必需的,但我想知道我是否应该在所有其他情况下,尝试将它们更喜欢正常的构造函数.
如何将项添加到初始化为的对象:
object obj = new { blah = "asdf" };
Run Code Online (Sandbox Code Playgroud)
如果我想添加另一个键值对,我怎么样?
当我犯了一个愚蠢的错误时,我正在处理我们的一个新应用程序......我忘了写一个对象初始化程序中的"new ClassName".奇怪的是VS刚刚编译了代码......没有任何错误或警告.(我用过VS 2015,.Net 4.5.2)
我的代码:
var target = new MyClass
{
MyValues = new List<MyOtherClass>
{
new MyOtherClass
{
Start = new DateTimeValue
{
DateTime = new DateTime(2015, 08, 23)
},
End = {
DateTime = new DateTime(2015, 08, 23)
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
(开始和结束都是DateTimeValue类型)
当我启动应用程序时,此代码抛出了NullReferenceException.(添加"new DateTimeValue"修复了问题).为什么编译器没有错误?