.net 旗袍致敬什么?
下面的代码有什么区别.net 旗袍致敬什么?,.net,vb.net,attributes,.net,Vb.net,Attributes,下面的代码有什么区别 ' no Flags' Public Enum MyEnum Monday = 1 Tuesday = 2 Wednesday = 4 Thursday = 8 End Enum 及 并在两种情况下获得相同的结果(带或不带FlagAttribute)。基本上,它告诉CLR可以组合枚举的值。如果没有此属性,组合这些值将产生未知值(但仍然有效)。使用该属性,可以正确解释组合 没有标志属性: ' Gives "Monday, Tuesday" ' Dim s A
' no Flags'
Public Enum MyEnum
Monday = 1
Tuesday = 2
Wednesday = 4
Thursday = 8
End Enum
及
并在两种情况下获得相同的结果(带或不带FlagAttribute)。基本上,它告诉CLR可以组合枚举的值。如果没有此属性,组合这些值将产生未知值(但仍然有效)。使用该属性,可以正确解释组合 没有
标志
属性:
' Gives "Monday, Tuesday" '
Dim s As String = (MyEnum.Monday Or MyEnum.Tuesday).ToString()
' Gives "3" '
Dim s As String = (MyEnum.Monday Or MyEnum.Tuesday).ToString()
没有标志
属性:
' Gives "Monday, Tuesday" '
Dim s As String = (MyEnum.Monday Or MyEnum.Tuesday).ToString()
' Gives "3" '
Dim s As String = (MyEnum.Monday Or MyEnum.Tuesday).ToString()
见托马斯·列夫的回答。例如,您可以执行以下操作:
开关(测试日)
{
案件编号:MyEnum,星期一:
{
//星期一的事
}
打破
案件编号:MyEnum,星期二:
{
//星期二什么时候
}
打破
案件MyEnum.星期一| MyEnum.星期二:
{
//星期一和星期二(哦,讽刺的是)
}
打破
}
它只影响ToString()我无法用VB代码回答,但在某些情况下,标志非常有用。你演示的例子不太好。想象一下,你得到的东西更像:
enum Format
{
Bold = 1,
Italic = 2,
Underlined = 4
}
然后您可以将格式指定为:
Format format = Format.Bold | Format.Italic;
// Then a check to see if the format is bold or italic should both pass.
现在它既是粗体的,也是斜体的(等于3)。但是,如果没有flags属性,您将无法设置此项。它可以防止选项相互排斥。要在没有标志的情况下执行上述操作,您必须执行以下操作:
enum Format
{
Bold,
BoldUnderlined,
BoldItalic,
BoldUnderlinedItalic,
Underlined,
Italic,
ItalicUnderlined
}
没有那么好。好,但实际上(没有ToString()
输出差异)它有什么意义吗?它还可能影响XML序列化。如果枚举没有Flags属性,则值组合的序列化将失败…能否为序列化问题提供链接?我没有链接,但您可以非常轻松地测试它。。。只要尝试序列化未知值的未知组合,如果Flags属性不存在,您将得到一个异常。我在这里发布了一个问题:引用您的答案。请你看一下好吗+1.见我对托马斯答案的评论。您的开关将在什么情况下工作,带或不带标志?为什么您说也,您知道其他“影响”吗?显然,这不是很有用?!它在某些情况下是有用的,但决不是关键的。@SerHio,不,它不会失败。只是测试了它。你是用组合值还是简单值进行了测试?有几种变体,还有Soap和二进制。还不确定其他XML序列化。根据MSDN,您不能。虽然我还没有试过,但你可以,正如你在我的例子中看到的。使用带有/不带FlagsAttribute的枚举格式
进行尝试。足以将值设置为2的幂是的,可以将值设置为2的幂。但是,如果在没有flags属性的情况下将值设置为3,则该值与枚举中包含的值不对应,因此它是未定义的。而对于Flags属性,它应该与组合的两个值进行比较。查看MSDN链接,在其中有一个示例,它们记录值。实际上,您需要知道您的格式是粗体还是斜体,可能不知道您的枚举是否“未定义”。您可以使用MyFormat MyFormat=MyFormat.Bold | MyFormat.Italic;如果((myFormat&myFormat.Bold)==myFormat.Bold){…}
-这可以使用或不使用标志。