什么时候使用int与Int32,或字符串与String?

在C#中, 内置类型的关键字只是System命名空间中相应类型的别名。

通常,使用关键字(例如int )或标识符(例如Int32 )来引用内置类型没有区别。 但是所有内容都有例外,所以我的问题分为两部分:

  1. C#何时要求您使用或不使用关键字?
  2. 何时使用关键字而不是标识符会改变程序的含义?

C#不要求您使用其中一个,因为它们是等效的。 这是个人偏好和编码惯例。 因此,使用对您和您的团队来说更具可读性的那个。 只有一个建议:保持一致:不要在代码库的一半中使用别名,在后半部分使用完整的类型名称。

stringSystem.String类型的别名, intSystem.Int32的别名。 因此,请根据您的喜好使用。

using alias指令 不能使用关键字作为类型名称(但可以在类型参数列表中使用关键字):

 using Handle = int; // error using Handle = Int32; // OK using NullableHandle = Nullable; // OK 

必须使用关键字指定枚举的基础类型 :

 enum E : int { } // OK enum E : Int32 { } // error 

表达式(x)+y(x)-y(x)*y的解释取决于x是关键字还是标识符:

 (int)+y // cast +y (unary plus) to int (Int32)+y // add y to Int32; error if Int32 is not a variable (Int32)(+y) // cast +y to Int32 (int)-y // cast -y (unary minus) to int (Int32)-y // subtract y from Int32; error if Int32 is not a variable (Int32)(-y) // cast -y to Int32 (int)*y // cast *y (pointer indirection) to int (Int32)*y // multiply Int32 by y; error if Int32 is not a variable (Int32)(*y) // cast *y to Int32 

标识符intstringbool等分别是真实类型Int32StringBoolean C#语言别名。 使用哪个并不重要,但是在编写API时,有些人更喜欢将实际的类类型用于别名。

这是一篇列出等价物的MSDN文章 。

它不要求您使用其中一个。 但是,如果您想要更大或更小的int,您可能希望显式使用Int16或Int64而不是int,这是Int32的别名。

我能想到的唯一一种情况是,你需要在一个你可能能够使用类名的forms中使用别名是在枚举类型的定义中:

 public enum MyEnum:Byte //will not compile public enum MyEnum:byte //correct 

另请注意,枚举的定义需要使用alias关键字,而在定义可接受任何枚举类型的代码成员时,请使用类名Enum。

最后,您永远不能将System.ValueType指定为基类或generics类型参数; 您改为使用struct关键字,它实际上是从ValueType派生的对象的别名。

一个问题是奇怪的using s或成员声明String / Int32可以映射到不同的类型(即不是mscorlib中的那个)或甚至是另一种成员,这会导致问题。

正如Jon所提到的,另一个问题是你不能使用标识符声明枚举(你得到错误“输入byte,sbyte,short,ushort,int,uint,long或ulong expected”)。

没关系。 int基本上是System.Int32的简写,它们几乎可以完全互换。 如果你愿意,可以将它视为#define(但C#不允许#defines这样)。