C# - StyleCop - SA1121:UseBuiltInTypeAlias - 可读性规则

时间:2011-05-14 07:48:14

标签: c# code-analysis rules stylecop

在StyleCop帮助手册中没有找到它,在SO和Google上,所以这里是;)

在StyleCop使用期间,我有一个警告:

  

SA1121 - UseBuiltInTypeAlias -   可读性规则

     

代码使用了一个基本的C#   类型,但不使用内置   该类型的别名。

     

而不是使用类型名称或   完全限定的类型名称,   这些类型的内置别名   应始终使用:bool,byte,   char,decimal,double,short,int,   long,object,sbyte,float,string,   ushort,uint,ulong。

所以String.Empty是错误的(取决于上述规则)并且string.Empty是好的。

为什么使用内置别名更好?可以String. Int32Int64(等)在特殊情况下的代码中复杂化吗?

6 个答案:

答案 0 :(得分:54)

只是澄清一下:并非所有人都同意StyleCop的作者。 Win32和.NET大师Jeffrey Richter在他出色的书CLR via C#中写道:

  

C#语言规范指出,“作为一种风格,关键字的使用受到青睐   使用完整的系统类型名称。“我不同意语言规范;我更喜欢   使用FCL类型名称并完全避免基本类型名称。事实上,我希望如此   编译器甚至没有提供原始类型名称,并迫使开发人员使用FCL   改为输入名称。以下是我的理由:

     
      
  • 我看到很多开发人员感到困惑,不知道是否使用字符串   或者代码中的字符串。因为在C#字符串(一个关键字)中完全映射到    System.String (一种FCL类型),没有区别,任何一种都可以使用。同样的,   我听说有些开发人员说应用程序时 int 表示32位整数   在32位操作系统上运行,并且它在应用程序时表示64位整数   正在64位操作系统上运行。这句话绝对是错误的:在C#中, int 总是映射   到 System.Int32 ,因此无论操作系统如何,它都代表一个32位整数   代码正在运行。如果程序员在他们的代码中使用 Int32 ,那么这个潜力   混乱也被消除了。

  •   
  • 在C#中,映射到 System.Int64 ,但使用其他编程语言   可以映射到 Int16 Int32 。实际上,C ++ / CLI确实将 long 视为 Int32 。   有人用一种语言阅读源代码很容易误解代码   如果他或她习惯于使用不同的编程语言进行编程。   事实上,大多数语言甚至不会将 long 视为关键字,也不会编译代码   使用它。

  •   
  • FCL有许多方法,它们将类型名称作为其方法名称的一部分。对于   例如, BinaryReader 类型提供了诸如 ReadBoolean ReadInt32 等方法,    ReadSingle 等等, System.Convert 类型提供了诸如    ToBoolean ToInt32 ToSingle ,依此类推。尽管编写以下内容是合法的   代码, float 的行对我来说感觉非常不自然,而且这条线是不明显的   正确的:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  •   
  • 许多使用C#的程序员都倾向于忘记其他编程   语言可以用来对付CLR,正因为如此,C#-isms进入了   类库代码。例如,微软的FCL几乎全部用C#编写   FCL团队的开发人员现在已经将方法引入了库中   数组 GetLongLength ,在C#中返回 Int64 long ,但不是   在其他语言中(如C ++ / CLI)。另一个例子是 System.Linq.Enumerable    LongCount 方法。

  •   

答案 1 :(得分:20)

如果你有自己的StringInt32等类型可能最终被用来代替System.*,那么代码真的会变得复杂 - 请不要这样做!

最终,这是个人偏好。我到处都使用别名,但我知道有些人(例如Jeffrey Richter)建议从不使用它们。保持一致可能是一个好主意,就是这样。如果您不喜欢StyleCop规则,请将其禁用。

请注意,方法等的名称应使用框架名称而不是别名,以便与语言无关。这对私人/内部成员来说并不那么重要,但您可能对私有方法的规则与公共方法的规则相同。

答案 2 :(得分:1)

因为内置别名是用这种语言表达概念的更自然的方式。

有些文化说足球,有些人说足球。哪一个更合适取决于具体情况。

答案 3 :(得分:0)

这个StyleCop规则假设使用别名可以减少对所谓的“普通语言用户”的混淆。例如,它知道'long'类型,但在某种程度上可怕的'System.Int64'类型并且混淆然后看到它。就个人而言,我认为只是在你的代码风格中一致是重要的,它不可能满足每个人

答案 4 :(得分:0)

不那么混乱?对于我来说,基本数据类型(传统上只是一个值)对于包含静态函数似乎非常不方便。我理解使用等价的基本数据类型,如果你只是存储一个值,但是为了访问类的成员,在基类型名称之后添加。(点)似乎非常不合适。

答案 5 :(得分:0)

类比可能会有所帮助: string System.String ,因为步枪是步枪。 string 是旧语言的遗留物,为旧程序员提供。 C#没有“内置”数据类型,这些别名是为那些在这个概念上遇到问题的“C”程序员提供的。