什么时候使用int和Int32,或者使用string和string才重要呢

本文关键字:string int Int32 什么时候 或者 | 更新日期: 2023-09-27 18:19:29

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

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

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

什么时候使用int和Int32,或者使用string和string才重要呢

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

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

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

using Handle = int; // error
using Handle = Int32; // OK
using NullableHandle = Nullable<int>; // 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,而不是Int32的别名int。

我能想到的唯一一种情况是,在枚举类型的定义中,需要以使用类名的形式使用别名:

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

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

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

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

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

这没关系。CCD_ 23基本上是CCD_ 24的简写,它们几乎是完全可交换的。如果你喜欢的话,可以将其视为#define(但C#不允许这样的#define)。