-
值类型
- 基本数据类型
- 整数类型:包括
sbyte
(有符号8位整数)、byte
(无符号8位整数)、short
(有符号16位整数)、ushort
(无符号16位整数)、int
(有符号32位整数,是最常用的整数类型)、uint
(无符号32位整数)、long
(有符号64位整数)、ulong
(无符号64位整数)。例如,int num = 10;
,这里num
变量直接存储了值10
。 - 浮点类型:
float
(单精度浮点数)和double
(双精度浮点数)。比如double pi = 3.14;
,变量pi
存储的是3.14
这个实际的值。 - 十进制类型:
decimal
,它主要用于高精度的金融计算等场景,例如decimal money = 10.0m;
(注意这里的m
后缀是用来明确表示这是一个decimal
类型的值)。 - 布尔类型:
bool
,它只有两个值true
和false
,例如bool isTrue = true;
,变量isTrue
直接存储了true
这个值。 - 字符类型:
char
,用于存储单个字符,例如char ch = 'A';
,变量ch
存储了字符'A'
的值。
- 整数类型:包括
- 枚举类型(Enum):
- 枚举是一种用户定义的值类型。例如定义一个表示星期几的枚举:
enum WeekDays { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }
- 当使用
WeekDays day = WeekDays.Monday;
时,day
这个变量存储的是枚举值Monday
对应的整数值(默认从0开始,Monday
为0,Tuesday
为1,以此类推),它是一个值类型。
- 结构体(Struct):
- 结构体是一种可以包含多个不同类型成员的数据结构。例如:
struct Point { public int X; public int Y; }
- 当创建一个结构体变量
Point p; p.X = 1; p.Y = 2;
时,变量p
直接存储了X
和Y
的值,是值类型。
- 基本数据类型
-
引用类型
- 类(Class):
- 类是面向对象编程的基本构建块。例如定义一个简单的
Person
类:
class Person { public string Name; public int Age; }
- 当创建一个
Person
对象Person p = new Person(); p.Name = "John"; p.Age = 30;
时,变量p
存储的是对象在堆内存中的引用地址,而不是对象的实际数据。
- 类是面向对象编程的基本构建块。例如定义一个简单的
- 接口(Interface):
- 接口定义了一组方法签名,但没有具体的实现。例如:
interface IAnimal { void MakeSound(); }
- 当一个类实现这个接口时,通过接口类型的变量引用这个对象,该变量存储的也是对象的引用,如
IAnimal animal = new Dog();
(假设Dog
类实现了IAnimal
接口)。
- 委托(Delegate):
- 委托是一种用于存储方法引用的类型。例如定义一个委托类型:
delegate void MyDelegate(int value);
- 当把一个方法赋值给委托变量时,如
MyDelegate del = Method1;
(假设Method1
是一个符合委托签名的方法),del
变量存储的是Method1
方法的引用。
- 数组(Array):
- 数组可以存储多个相同类型的元素。例如
int[] numbers = new int[5];
,numbers
变量存储的是数组在内存中的引用,通过这个引用可以访问数组中的元素。
- 数组可以存储多个相同类型的元素。例如
- 字符串(String):
- 在C#中,
string
是引用类型,虽然它的行为在很多方面类似于值类型。例如string str = "Hello";
,str
变量存储的是字符串对象在内存中的引用。但C#编译器对string
类型进行了特殊处理,使得它在赋值和参数传递等操作时表现得更像值类型,这种处理称为字符串驻留。
- 在C#中,
- 类(Class):
需要注意的是,值类型变量直接存储其数据,而引用类型变量存储的是数据在内存中的引用地址,这是它们之间的本质区别。这种区别会影响到变量的赋值、参数传递等操作的行为。