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

bin*_*all 37 c# code-analysis stylecop rules

没有在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. Int32,Int64(等)在特殊情况下的代码中复杂化吗?

And*_*ykh 57

只是为了澄清:并非每个人都同意StyleCop的作者.Win32和.NET大师Jeffrey Richter在他的优秀书籍CLR中通过C#写道:

C#语言规范指出,"作为一种风格问题,使用关键字比使用完整的系统类型名称更受青睐."我不同意语言规范; 我更喜欢使用FCL类型名称并完全避免基本类型名称.实际上,我希望编译器甚至不提供原始类型名称,并强迫开发人员使用FCL类型名称.这是我的理由:

  • 我看到许多开发人员感到困惑,不知道是否在他们的代码中使用字符串字符串.因为在C#string(一个关键字)中精确映射到 System.String(一种FCL类型),所以没有区别,任何一种都可以使用.类似地,我听说有些开发人员说当应用程序在32位操作系统上运行时,int表示32位整数,当应用程序在64位操作系统上运行时,它表示64位整数.这句话绝对是错误的:在C#中,int总是映射到System.Int32,因此它表示一个32位整数,而不管代码运行的操作系统如何.如果程序员在他们的代码中使用Int32,那么这种潜在的混淆也会被消除.

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

  • FCL有许多方法,它们将类型名称作为其方法名称的一部分.例如,BinaryReader类型提供诸如ReadBoolean,ReadInt32, ReadSingle等方法,而System.Convert类型提供诸如 ToBoolean,ToInt32,ToSingle等方法.虽然编写下面的代码是合法的,但浮点线对我来说感觉非常不自然,并且线条不正确并不明显:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
    Run Code Online (Sandbox Code Playgroud)
  • 许多使用C#的程序员都倾向于忘记可以使用其他编程语言来对抗CLR,因此,C#-isms会进入类库代码.例如,微软的FCL几乎全部用C#编写,FCL团队的开发人员现在已经在库中引入了方法,例如 ArrayGetLongLength,它返回一个在C#中很长Int64值,但在其他语言中却没有(比如C++)/CLI).另一个例子是System.Linq.EnumerableLongCount方法.

  • @Cody Gray:随时编辑.我花了大约一个半小时打字并格式化文本.你看到的结果是我能想到的最好的结果.我在文中明确指出,引用一直持续到答案结束.如果您认为可以改善这一点,请编辑答案. (6认同)

Jon*_*eet 20

它将如果你有你自己的代码只有真正复杂String,Int32等被使用,而不是它可能最终类型System.*-请不要这么做!

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

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