【发布时间】:2016-05-01 05:08:46
【问题描述】:
在某些情况下,当我将 Enum 传递给方法时,我需要处理它是单个 Enum 值还是标志组合,为此我编写了这个简单的扩展:
Vb.Net:
<Extension>
Public Function FlagCount(ByVal sender As System.[Enum]) As Integer
Return sender.ToString().Split(","c).Count()
End Function
C#(在线翻译):
[Extension()]
public int FlagCount(this System.Enum sender) {
return sender.ToString().Split(',').Count();
}
示例用法:
Vb.Net:
Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.FlagCount()
MessageBox.Show(flagCount.ToString())
C#(在线翻译):
FileAttributes flags = (FileAttributes.Archive | FileAttributes.Compressed);
int count = flags.FlagCount();
MessageBox.Show(flagCount.ToString());
我只是想问是否存在一种更直接和有效的方式,我目前正在做的事情是避免将标志组合表示为字符串然后拆分它。
【问题讨论】:
-
Enum.GetValues(typeof(YourEnum)).OfType<YourEnum>().Count(enumValue => yourValue.HasFlag(enumValue))怎么样? -
离题说明:您可以通过省略不必要的关键字和限定符使您的源代码对您和您的团队更具可读性:您可能希望将
Function FlagCount(ByVal sender As System.[Enum]) As Integer更改为Function FlagCount(sender As [Enum]) As Integer(与 C# 不同,在 VB 中函数默认是公共的,ByVal是一个遗留物,类型限定符是多余的,尤其是对于System...除非你必须在 Visual Studio 2010 或更早版本中编码) -
@miroxlav 我很欣赏你的建议,但我认为相反,Vb.Net 的默认隐式并不意味着开发人员应该忽略这些关键字,
ByVal关键字仍然存在,为什么?:使用它,这不是一个坏习惯,当代码包含带有ByRef的参数和不带ByVal的参数时,可读性会降低。另一方面,我完全同意System命名空间规范,但这是有充分理由的,在我的真实源代码中,出于设计原因,包含扩展的模块被命名为Enum,然后我需要指定 @987654335 @命名空间以避免歧义。 -
@ElektroStudios - 没问题,谢谢你的回答。
ByVal的存在主要是出于遗留原因(您实际上永远需要命名它)并且恕我直言,'ByRefvs. nothing' 比 'ByRefvs.ByVal' 更具可读性,因为ByRef仅在少数情况下使用,并且在单独使用时非常显眼。但这只是旁注……只保留最适合您的。 :) -
miroxlav 没关系,人们有不同的喜好/口味(对不起我的英语不好),也谢谢你的意见。当然也要感谢@Corak。
标签: c# .net vb.net enums enum-flags