为什么.NET枚举允许在最后一个字段中使用逗号?
这有什么特别的意义吗?
[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
Default = 1,
ReadOnly = 2,
Optional = 4,
DelegateProperty = 32,
Metadata = 8,
NonSerialized = 16,
}
答案 0 :(得分:61)
它没有特殊意义,只是编译器的工作方式,主要是出于这个原因:
[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
Default = 1,
ReadOnly = 2,
Optional = 4,
DelegateProperty = 32,
Metadata = 8,
NonSerialized = 16,
//EnumPropertyIWantToCommentOutEasily = 32
}
通过评论请求:此信息直接来自C# Specification (Page 355/Section 17.7)
与标准C ++一样,C#在数组初始值设定项的末尾允许使用尾随逗号。此语法提供了从此类列表中添加或删除成员的灵活性,并简化了此类列表的计算机生成。
答案 1 :(得分:12)
另外(对于Nick Craver的帖子)更容易添加新的枚举。
此行为不适用于枚举。请考虑以下事项:
var list = new int[] { 1, 2, 3, };
答案 2 :(得分:10)
另一个原因:它使编码gen变得更容易。
答案 3 :(得分:1)
我知道这是一个古老的主题,但另一种对此问题有意义的方法是代码版本控制系统。
考虑以下示例:
//version 1
var myArray = {
"item 1",
"item 2"
};
//version 2
var myArray = {
"item 1",
"item 2", //will be considered a change, it may be considered an erroneous approach
"item 3"
}
现在考虑这种方法:
//version 1
var myArray = {
"item 1",
"item 2",
};
//version 2
var myArray = {
"item 1",
"item 2", //will not be considered a change, it may be considered an erroneous approach too, but, means that the code wasn't changed intrinsically
"item 3",
};
无论如何,根据具体情况,这两种方法都可能被视为不正确或正确。我特别喜欢在处理代码版本控制系统时更有意义的第二种方法。
无论如何希望这有帮助。
答案 4 :(得分:0)
为什么在手动编写代码时应该利用此功能?
在以前的开发人员没有留下逗号的情况下添加一行的示例:
select opposition,
sum(dismissal = 'caught') caught,
sum(dismissal = 'bowled') bowled,
sum(dismissal = 'run out') run_out,
sum(dismissal = 'not out') not_out
from batsman
group by opposition
在先前的开发人员留下尾随逗号时添加一行的示例:
@@ -119,7 +119,8 @@ namespace SomeApp.Example
{
NameTitle = contact.NameTitle,
GivenName = contact.GivenName,
- FamilyName = contact.FamilyName
+ FamilyName = contact.FamilyName,
+ ProperName = contact.ProperName
},
ContactTelephone1 = contact.ContactTelephone1,
ContactType = contact.ContactType,
请注意,后者添加了一行,而删除了一行,又添加了两行。这对于人和机器都更容易处理。
关于允许的原因,以及其他答案:
C#规范(第355页/第17.7节)规定:
类似于Standard C ++,C#允许在数组初始化程序的末尾添加逗号。这种语法提供了在此类列表中添加或删除成员的灵活性,并简化了此类列表的计算机生成。
这适用于数组初始化程序,对象初始化程序和枚举。