.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){…}
-这可以使用或不使用标志。