代码分析 - C# - StyleCop - SA1121:使用内置类型别名 - 可读性规则



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

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

SA1121 - 使用内置类型别名 - 可读性规则

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

而不是使用类型名称或 完全限定的类型名称,即 这些类型的内置别名 应始终使用:布尔值、字节、 字符, 十进制, 双精度, 短, 整数, 长, 对象, 字节, 浮点数, 字符串, 乌短,乌因特,乌龙。

所以String.Empty是错的(取决于上面的规则),string.Empty是好的。

为什么使用内置别名更好?String. Int32Int64(等)是否会在特殊情况下使代码中的某些内容复杂化?

澄清一下:并不是每个人都同意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# 中,long 映射到 System.Int64,但在不同的编程语言中,long 可以映射到 Int16Int32。事实上,C++/CLI 确实将 long 视为 Int32。 用一种语言阅读源代码的人很容易误解代码的 如果他或她习惯于使用不同的编程语言编程,则打算。 事实上,大多数语言甚至不会将 long 视为关键字,也不会编译代码。 使用它。

  • FCL 有许多方法将类型名称作为其方法名称的一部分。为 例如,BinaryReader 类型提供了诸如 ReadBooleanReadInt32ReadSingle等,System.Convert类型提供了诸如 ToBooleanToInt32ToSingle等。虽然写以下内容是合法的 代码,带有浮点数的行对我来说感觉很不自然,而且该行并不明显 正确:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • 许多专门使用 C# 的程序员往往会忘记其他编程 语言可以用于对抗 CLR,正因为如此,C# 主义悄悄进入 类库代码。例如,Microsoft的FCL几乎完全是用C#编写的,并且 FCL 团队的开发人员现在已经将方法引入到库中,例如 数组GetLongLength,它返回一个 Int64 值,该值在 C# 中很长,但不是 使用其他语言(如 C++/CLI)。另一个例子是System.Linq.Enumerable长计数方法。

如果您有自己的 StringInt32 等类型,最终可能会被使用而不是System.*,这只会使代码真正复杂化 - 请不要这样做!

归根结底,这是个人喜好。我到处都使用别名,但我知道有些人(例如杰弗里·里希特)建议永远不要使用它们。保持一致可能是个好主意,仅此而已。如果您不喜欢该 StyleCop 规则,请禁用它。

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

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

有些文化

说足球,有些文化说足球。哪一个更合适取决于上下文。

这个 StyleCop 规则假设使用别名会减少对所谓的"普通语言用户"的混淆。例如,它知道"长"类型,但不知何故对"System.Int64"类型感到恐惧,然后感到困惑然后看到它。我个人认为,仅仅为了在代码风格上保持一致是重要的,不可能让每个人都满意

不那么混乱?对我来说,传统上只是一个值的基本数据类型包含静态函数似乎很奇怪。如果您只是存储一个值,我理解使用等效的基本数据类型,但是对于访问类的成员,放置一个.(点)在基本类型名称之后。

打个比方可能会有所帮助:字符串之于System.String,就像火枪之于步枪一样。 字符串是旧语言的遗物,是为老程序员提供的。 C# 没有"内置"数据类型,这些别名是为对此概念有问题的一代"C"程序员提供的。

相关内容

  • 没有找到相关文章

最新更新