跳转至

1.数据类型

类型中可存储以下信息:

  1. 类型变量所需的内存空间。

  2. 可以表示的最大值和最小值。

  3. 在运行时分配变量内存的位置。

  4. 包含的成员(方法、字段、事件等)。

  5. 继承自的基类型。

  6. 允许执行的运算种类。

数值类型

整型

C# 类型/关键字 范围 大小 .NET 类型
sbyte -128 到 127 8 位带符号整数 System.SByte
byte 0 到 255 无符号的 8 位整数 System.Byte
short -32,768 到 32,767 有符号 16 位整数 System.Int16
ushort 0 到 65,535 无符号 16 位整数 System.UInt16
int -2,147,483,648 到 2,147,483,647 带符号的 32 位整数 System.Int32
uint 0 到 4,294,967,295 无符号的 32 位整数 System.UInt32
long -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 64 位带符号整数 System.Int64
ulong 0 到 18,446,744,073,709,551,615 无符号 64 位整数 System.UInt64

在上表中,最左侧列中的每个 C# 类型关键字都是相应 .NET 类型的别名。它们是可互换的。 例如,以下声明声明了相同类型的变量:

int a = 8;
System.Int32 b = 8;

每个整型类型的默认值都为零 0。

int int_var;
Console.WriteLine(int_var)
0

每个整型类型都有 MinValue 和 MaxValue 常量,提供该类型的最小值和最大值。

int.MinValue
-2147483648

浮点型

C# 支持以下预定义浮点类型:

C# 类型/关键字 大致范围 精度 大小 .NET 类型
float ±1.5 x 10−45 至 ±3.4 x 1038 大约 6-9 位数字 4 个字节 System.Single
double ±5.0 × 10−324 到 ±1.7 × 10308 大约 15-17 位数字 8 个字节 System.Double
decimal ±1.0 x 10-28 至 ±7.9228 x 1028 28-29 位 16 个字节 System.Decimal

每个浮点类型的默认值都为零,0。 每个浮点类型都有 MinValue 和 MaxValue 常量,提供该类型的最小值和最大有限值。 float and double 类型还提供可表示非数字和无穷大值的常量。 例如,double 类型提供以下常量:Double.NaN、Double.NegativeInfinity 和 Double.PositiveInfinity。

Console.WriteLine(double.NaN);
Console.WriteLine(double.NegativeInfinity);
Console.WriteLine(double.PositiveInfinity);
Console.WriteLine("----------");
Console.WriteLine(float.NaN);
Console.WriteLine(float.NegativeInfinity);
Console.WriteLine(float.PositiveInfinity);
NaN
-∞
∞
----------
NaN
-∞
∞

在初始化或赋值的时候,真实浮点类型由其后缀确定,如下所示:

  • 不带后缀的文本或带有 dD 后缀的浮点数的类型为 double
  • 带有 fF 后缀的浮点数的类型为 float
  • 带有 mM 后缀的浮点数的类型为 decimal

如果声明一个floatdecimal类型的变量,但初始化时不带有相应的后缀,则编译时会出错。

float myMoney = 123.123;
Console.WriteLine(myMoney.GetType());
(1,17): error CS0664: Literal of type double cannot be implicitly converted to type 'float'; use an 'F' suffix to create a literal of this type

进制表示

C# 中可以直接使用的进制系统有二进制、十进制、十六进制。

// 二进制
sbyte base_8 = 0b10;
Console.WriteLine(base_8);

// 十六进制 0x 作为前缀
sbyte base_16 = -0x12;
Console.WriteLine(base_16);
2
-18

bool类型

bool 类型关键字是 .NET System.Boolean 结构类型的别名,它表示一个布尔值,可为 true 或 false。

字符类型

char 类型关键字是 .NET System.Char 结构类型的别名,它表示 单个Unicode UTF-16 字符。

类型 范围 大小 .NET 类型
char U+0000 到 U+FFFF 16 位 System.Char

char 类型的默认值为 \0,即 U+0000。

可以使用以下命令指定 char 值:

  • 字符文本。
  • Unicode 转义序列,它是 \u 后跟字符代码的十六进制表示形式(四个符号)。
  • 十六进制转义序列,它是 \x 后跟字符代码的十六进制表示形式。

注意:单引号表示char类型,双引号表示string类型。

char unicode_string = '\x4e2d';
Console.WriteLine(unicode_string);
unicode_string = '\u4e2d';
Console.WriteLine(unicode_string);
中
中

引用类型

字符串类型

string 类型表示零个或多个 Unicode 字符的序列。 string 是 System.String 在 .NET 中的别名。尽管 string 为引用类型,但是定义相等运算符 == 和 != 是为了比较 string 对象(而不是引用)的值。

注意:单引号表示char类型,双引号表示string类型。

虽然字符串时引用类型,但字符串是不可变的,这和Python是一样的,所以在C#中无法对字符串变量赋值。

string str_1 = "string_1";
Console.WriteLine(str_1);
str_1 = "string_2"
Console.WriteLine(str_1);
(3,19): error CS1002: ; expected

尽管有些语法上看似乎可以更改字符串的内容,但事实上并不可行。例如,编写此代码时,编译器实际上会创建一个新的字符串对象来保存新的字符序列,且该新对象将赋给str_2。 已为 str_2 分配的内存(当它包含字符串“h”时)可用于垃圾回收。

string str_2 = "h";
str_2 += "ello";

逐字字符串

和Python一样,C# 使用反斜杠\表示转义,如果想让一个带有转义字符的字符串不进行转义,可以为字符串添加前缀@,这称为逐字字符串。逐字字符串的优点是不处理转义序列,这样就可轻松编写完全限定的 Windows 文件名:

@"c:\Docs\Source\a.txt"  // rather than "c:\\Docs\\Source\\a.txt"
c:\Docs\Source\a.txt

若要在 @-quoted 字符串中包含双引号,双倍添加即可:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
"Ahoy!" cried the captain.

微软官方文档

类型、变量和值

.NET 类库概述

var tmp123 = "string";
Console.WriteLine(tmp123.GetType());
System.String