.Net - 避免魔术弦的策略

Mel*_*sus 8 .net magic-string

在工作代码中,我们有许多魔术字符串的使用,如下面的代码片段:

if (user.HasRight("Profile.View")) {...}
Run Code Online (Sandbox Code Playgroud)

因此,有很多地方我们将字符串作为参数传递,以查看用户是否具有特定权限.我不喜欢这样,因为它产生了很多神奇的字符串.

做一个更好的方法是什么?

Enum,Constant,class?

Jus*_*ner 17

在该特定情况下,使用Enum.没有神奇的字符串,如果Enum发生变化(以某种方式破坏魔术字符串解决方案),应用程序将不再编译.

public enum ProfilePermissions
{
    View,
    Create,
    Edit,
    Delete
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地:

if(user.HasRight(ProfilePermissions.View)) { }
Run Code Online (Sandbox Code Playgroud)

您也可以使用一个类,但是当涉及更复杂的场景时,您会限制自己.例如,将Enumeration简单地更改为:

public enum ProfilePermissions
{
    View = 1,
    Create = 2,
    Edit = 4,
    Delete = 8
}
Run Code Online (Sandbox Code Playgroud)

允许您使用按位运算符来获得更复杂的权限(例如,用户需要创建或删除的情况):

if(user.HasRight(ProfilePermissions.Create | ProfilePermissions.Delete));
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 8

这在.NET框架中也很常见.示例是System.Windows.DataFormats和System.Net.WebRequestMethods.Http.你想要的只读品种:

public static class MumbleRights {
  public static readonly string ProfileView = "Profile.View";
  // etc..
}
Run Code Online (Sandbox Code Playgroud)

  • @Markus,如果从外部装配中使用公共常量,它们就会被烘焙; 如果稍后更改公共常量,外部程序集仍将使用它在编译时看到的常量. (7认同)