11

考虑这个String.Split重载的问题,它以StringSplitOptions枚举作为参数。

枚举本身是公共的并且可以被包括 System 命名空间的所有东西访问,这不是很糟糕吗?我的意思是,枚举完全特定于Split方法的选项,但它在其范围之外可用。

也许有更好的建模方法,比如将枚举放在 String 类本身中,并通过使用String.SplitOptions例如访问它?我很少看到这种情况(我现在实际上不记得任何这种情况),所以我认为由于某种原因它不是首选。一般来说,我认为缩小事物的范围是一种最佳实践,因为可以说,通过在不正确的范围内使用类/成员来降低发生问题的机会。

我在Split这里用作示例,但是 aEnum也仅由我们的代码库中的方法或类使用是很常见的。我通常像任何其他类一样在单独的 cs 文件中将枚举创建为公共类型,但我很想听听解决这个“问题”的其他方法。

更新:

我刚刚发现这篇文章Folder用一个类和一个枚举来攻击这个确切的问题,Filter但似乎又违背了我认为在这种情况下更正确的做法(以某种方式将枚举放在类中)。ToddM 的其中一条评论(我碰巧同意)指出:

...

但是,即使那样,我也觉得你的逻辑是错误的。您对在类中嵌入枚举的主要抱怨是输入时间太长。考虑到 C# 的冗长程度,这并不是一个明智的论点。在 VS 中,CTRL+SPACE 是你的朋友。

从逻辑上讲,我觉得将枚举放在类中要正确得多。举个例子:什么是 MyNameSpace.Filter?它适用于什么地方?我猜这是您命名空间的过滤器?这是不可能的,尤其是当你的命名空间增长到包含几十个类时。

现在考虑 MyNameSpace.Folder.Filter —— 在我看来,Filter 以某种方式、形状或形式应用于 Folder 类要直观得多。实际上,可以使用自己的过滤器概念将另一个类添加到名称空间,其中一个成员可能是“文件”。仅仅因为您在命名空间中引入了一个新类,并不赋予您使用各种“帮助”类型污染该命名空间的权利。如果您是作为大型开发团队的一员进行开发,那么您的风格很粗鲁。

...

4

3 回答 3

8

嵌套 是一个有趣的想法,enum以表明它具有缩小的范围,或者赋予它更好的语义。我之前使用过这个想法,以便在我开发的后编译器中同时包含错误代码和警告代码。这样,我可以使用Code嵌套在ErrorclassWarningclass中的相同枚举名称。

另一方面,通常不鼓励公共嵌套类型。它们可能会使必须使用外部类名限定它们的客户感到困惑。查看MSDN上的相关指南。一些相关的:

不要使用公共嵌套类型作为逻辑分组结构;为此使用名称空间。

避免公开暴露的嵌套类型。唯一的例外是嵌套类型的变量只需要在极少数情况下声明,例如子类化或其他高级定制场景。

如果类型可能在包含类型之外被引用,则不要使用嵌套类型。

例如,传递给类上定义的方法的枚举不应定义为类中的嵌套类型。

我相信在开发枚举时遵循了这些准则StringSplitOptions,以及 BCL 中的大多数其他准则。

于 2013-10-18T13:40:54.693 回答
0

String.Split()是公开的,所以StringSplitOptions也必须公开。两者都String存在StringSplitOptionsSystem命名空间中。两者都有公共范围。两者都不是“在[对方]范围之外可用”。

于 2013-10-18T13:34:52.233 回答
0

我认为原因之一是它会使每个使用嵌入式枚举的调用更广泛(类的名称成为强制性前缀)。

我个人不喜欢ResultSetTransformer.ResultSetTransformerOptions每次必须使用此枚举时都必须使用,这会使我的行长得可怕。

但正如其他人指出的那样,我认为在类中嵌入枚举根本不是框架中的标准,可能是因为这个原因。

于 2013-10-18T13:42:08.740 回答