C#属性命名约定

4
在C#中,属性应该使用PascalCase命名,并在其名称之后加上“Attribute”后缀,如此处所述。我的问题与更微妙的事情有关; 当涉及到自然语言时,属性应该如何命名?
例如 - 我有一个授权属性在ASP MVC应用程序中,它检查已登录用户是否有权查看模块(由特定控制器表示)。我决定将其命名为:
[IsLoggedUserAuthorizedToSeeModule(ModuleName = ModuleManager.Modules.ExampleModule)]
public class ExampleModuleController : BaseController
{
    ...
}

我很容易理解,但这是一个很长的名称,我对此表示怀疑。微软通常会提供默认属性的简短名称,但它们并不是非常统一。 Serializable 属性意味着装饰的类可以被序列化。 ObsoleteAttribute 属性意味着装饰的类有一些状态。Description 和 Category 属性定义元数据。

默认 .NET 属性的完整列表可以在这里找到。

有关属性命名约定的指南吗?你知道任何相关文章吗?


3
在我看来,“[只对授权用户可见]”会更好。它听起来更像是一个陈述,说明了属性的对象,而你的名字听起来像一个函数。 - GSerg
1
似乎 ModulePermissions 是一个更通用的名称,以后可以添加其他属性。IsLoggedUserAuthorizedToSeeModule 是具体的,如果该属性需要支持其他选项,则可能需要更改。 - Loathing
3
用户是被记录到文件中还是已经在会话中登录了? - Mark Jansen
我会使用命令式的方式来命名它:[ExposeModuleToAuthenticatedUser] 或者 [ExposeModuleToLoggedUser] - Matthew Watson
@MatthewWatson 命令式编程很好,但不仅仅是认证 - 只有授权才可以。 - Arkadiusz Kałkus
显示剩余3条评论
1个回答

2

属性应使用短而简洁的帕斯卡命名规则。

毕竟,它们装饰汇编成员,当您看到一个应用的属性时,您想通过仅阅读其名称来理解它们的含义。

无论如何,“如何命名您的属性”都是主观的。对我来说有意义的可能会让你感到困扰。

关于您具体的属性IsLoggedUserAuthorizedToSeeModuleAttribute,也许可以简化为只使用AllowedModuleAttribute,并实现另一个属性AuthorizeAttribute或重用MVC的属性):

// This way you splitted out the concept of "logged users" and "what module"
[Authorize, AllowedModule(ModuleManager.Modules.ExampleModule)]
public class ExampleModuleController : BaseController
{
    ...
}

1
@SamAxe 嗯,“授权(Authorize)”意味着您需要经过安全授权。这就是为什么将“Allowed”作为该属性的一部分进行维护的原因。您可能已经登录并经过授权,但不能使用某些模块。 - Matías Fidemraizer
@Landeeyo 你不需要检查那里的“已登录用户”。属性是描述性的。授权+允许模块=“您必须已登录并且我允许您使用此模块” - Matías Fidemraizer
@Landeeyo 说到底,属性就像publicprivate一样……它们是内置修饰符的扩展。你不需要想“如果我放了X属性,那么我应该做Y”。N个属性的总和意味着Z。 - Matías Fidemraizer
@Landeeyo 再说一遍,你的想法是错误的...谁在乎你假设所有用户都已经通过身份验证了呢?在你的特定情况下,这个控制器想要表达的是,你需要放置这两个属性来定义“授权用户可以看到该模块”。 - Matías Fidemraizer
1
@Landeeyo,考虑一下数据注释。你能想象一个属性叫做“MinLengthAndNotEmptyAttribute”吗?不。应该要有两个属性,即MinLength和NotEmpty。 - Matías Fidemraizer
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接