在最近出现了很多讨论关于C#什么新的6.0
的一个最受关注的功能是通过Dictionary在初始化C#6.0
别急,我们一直在使用集合初始化器来初始化集合,并可以很好的初始化Dictionary也.NET 4.0和.NET 4.5(不知道旧版本)之类的
Dictionary<int, string> myDict = new Dictionary<int, string>() {
{ 1,"Pankaj"},
{ 2,"Pankaj"},
{ 3,"Pankaj"}
};
Run Code Online (Sandbox Code Playgroud)
那么C#6.0中有什么新东西,他们在C#6.0中讨论的是什么字典初始化器
我在阅读 Avalonia 源代码时发现了这句话:
return new MenuFlyoutPresenter
{
[!ItemsControl.ItemsProperty] = this[!ItemsProperty],
[!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty]
};
Run Code Online (Sandbox Code Playgroud)
我从未见过这样的语法。如果没有索引属性或 this[] 访问器,这些括号会做什么?如果它们引用的属性不是 bool,为什么它们会用感叹号否定?也许是某种空检查?
代码本身包含在以下 cs 文件中:
https://github.com/AvaloniaUI/Avalonia/blob/master/src/Avalonia.Controls/Flyouts/MenuFlyout.cs
我跟踪了代码,但无法理解该语法的作用。
我想用一个对象和特定顺序的对象列表初始化一个列表.目前,我正在做:
List<MyObject> list = new List<MyObject>();
list.Add(object1); // object1 is type MyObject
list.AddRange(listOfObjects); // listOfObjects is type List<MyObject>
Run Code Online (Sandbox Code Playgroud)
我希望将其整合到初始化语句中(当然语法错误):
List<MyObject> newList = new List<MyObject>() { object1, listOfObjects };
Run Code Online (Sandbox Code Playgroud)
有没有办法简洁地做到这一点?
我一直在使用C#,但最近注意到我的一个单元测试的行为根据我使用的集合初始化表达式的变化而改变:
var object = new Class { SomeCollection = new List<int> { 1, 2, 3 } };var object = new Class { SomeCollection = { 1, 2, 3 } };直到这一点,我认为第二种形式只是语法糖,在语义上等同于第一种形式.然而,在这两种形式之间切换导致我的单元测试失败.
下面的示例代码演示了这一点:
void Main()
{
var foo1 = new Foo { Items = new List<int> { 1, 2, 3} };
var foo2 = new Foo { Items = { 1, 2, 3 } };
foo1.Dump();
foo2.Dump();
}
class Foo
{
public List<int> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,第一个分配工作正常,但第二个分配结果为 …
是否可以同时组合List初始化器和对象初始化器?给定以下类定义:
class MyList : List<int>
{
public string Text { get; set; }
}
// we can do this
var obj1 = new MyList() { Text="Hello" };
// we can also do that
var obj2 = new MyList() { 1, 2, 3 };
// but this one doesn't compile
//var obj3 = new MyList() { Text="Hello", 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
这是设计还是仅仅是c#编译器的错误或缺失功能?
我读过:
团队一直忙于实现初始化程序的其他变体.例如,您现在可以初始化Dictionary对象
但看看:
var Dic = new Dictionary<string,int>{ {"x",3}, {"y",7} };
Run Code Online (Sandbox Code Playgroud)
VS
var Dic = new Dictionary<string,int>{ ["x"]=3, ["y"]=7 };
Run Code Online (Sandbox Code Playgroud)
我不知道好处在哪里.它看起来一样.两者都只是一个名值集合.
他们用成对的方括号和一些逗号交换成对的花括号
题:
使用新语法的附加值是什么?一个现实世界的例子将非常感激.
我一直认为它在两方面都很好.然后做了这个测试并意识到它不允许重新分配:
int[] a = {0, 2, 4, 6, 8};
Run Code Online (Sandbox Code Playgroud)
工作正常但不是:
int [ ] a;
a = { 0, 2, 4, 6, 8 };
Run Code Online (Sandbox Code Playgroud)
这有什么技术原因吗?我想我会在这里问一下,因为这种行为是我直觉所期望的.
.net c# compiler-construction collections collection-initializer
可以隐式声明下一个Dictionary<HyperLink, Anonymous>:
{ urlA, new { Text = "TextA", Url = "UrlA" } },
{ urlB, new { Text = "TextB", Url = "UrlB" } }
Run Code Online (Sandbox Code Playgroud)
所以我可以这样使用它:
foreach (var k in dic)
{
k.Key.Text = k.Value.Text;
k.Key.NavigateUrl = k.Value.Url;
}
Run Code Online (Sandbox Code Playgroud)
?
我有一个大的静态列表,它基本上是一个查找表,所以我在代码中初始化表.
private class MyClass
{
private class LookupItem
{
public int Param1 { get; set; }
public int Param2 { get; set; }
public float Param2 { get; set; }
public float Param4 { get; set; }
}
private static List<LookupItem> _lookupTable = new List<LookupItem>()
{
new LookupItem() { Param1 = 1, Param2 = 2, Param3 = 3 Param4 = 4 },
new LookupItem() { Param1 = 5, Param2 = 6, Param3 = 7 Param4 = 8 },
//etc
} …Run Code Online (Sandbox Code Playgroud) 我正在考虑数组和列表,并想知道类是否以及如何使实现可以像它们一样进行初始化.我们以此课程为基础:
class TestClass
{
private List<int> Numbers = new List<int> ();
// Insert code here
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是获取给定的值并在内部填充我的列表.
TestClass test = new TestClass () { 2, 4, 7, 10 };
Run Code Online (Sandbox Code Playgroud)
通常可能是这样的:
List<int> test = new List<int> () { 2, 4, 7, 10 };
Run Code Online (Sandbox Code Playgroud)
但我想将它用于我自己的自定义类.下一个问题是可选的,如果对此语法可以做同样的事情:
TestClass test = { 2, 4, 7, 10 };
Run Code Online (Sandbox Code Playgroud)
我认为不太可能.请注意,这些与此不同:
Cat cat = new Cat() { Name = "Sylvester", Age=8 };
Run Code Online (Sandbox Code Playgroud)
这些是内部字段和属性的直接和可选声明.