在C#中,数据类型被分为两大类:值类型(Value Types)和引用类型(Reference Types)。
区别
这两种类型的主要区别:在于它们在内存中的存储方式以及它们的行为方式。
值类型:存储在 栈空间 ——系统分配,自动回收,小而快
引用类型:储存在 堆空间——手动申请和释放
一 值类型
值类型变量直接存储数据。这意味着当你将一个值类型变量赋值给另一个同类型的变量时,实际上是将值复制给了新变量。因此,两个变量在内存中存储的是独立的值,修改一个变量不会影响另一个变量。
C#中的值类型包括:
-
整型:
int
、short
、long
、byte
、sbyte
、uint
、ulong
、char
int myInt = 10; short myShort = 1000; // 注意范围,short的最大值是32767 long myLong = 10000000000; byte myByte = 255; // 0到255 sbyte mySByte = -128; // -128到127 uint myUInt = 4294967295u; // 注意无符号,u后缀 ulong myULong = 18446744073709551615ul; // 注意无符号,ul后缀 char myChar = 'A'; // 或者使用Unicode字符 char unicodeChar = '\u0041'; // 也是'A'
-
浮点型:
float
、double
、decimal
float f=1f; double d=1.1; decimal de=1.1m;
-
布尔型:
bool
bool a= true;
-
结构类型(Struct Types):用户自定义的结构体(struct)
-
枚举类型(Enum Types):一种特殊的值类型,用于定义变量的集合
-
可空类型(Nullable Types):基于值类型的可空变体,例如
int?
结构类型
struct Point { public int X; public int Y; public Point(int x, int y) { X = x; Y = y; } } // 使用结构体 Point p1 = new Point(1, 2); Point p2 = p1; // 这里是值复制 p2.X = 10; // 修改p2不会影响p1 Console.WriteLine($"p1: ({p1.X}, {p1.Y})"); // 输出: p1: (1, 2) Console.WriteLine($"p2: ({p2.X}, {p2.Y})"); // 输出: p2: (10, 2)
可空类型
int? nullableInt = null; int? anotherNullableInt = 5; if (nullableInt.HasValue) { Console.WriteLine(nullableInt.Value); // 如果nullableInt不是null,则输出其值 } else { Console.WriteLine("nullableInt is null"); }
代码示例
private static void Main(string[] args) { //值传参 传递的是值 //复制一份 int num = 10; add(num); Console.WriteLine("main====>" + num); //10 } public static void add(int num) { num++; Console.WriteLine("add====>"+num); //11 }
二 引用类型
引用类型变量存储的是对数据的引用(即内存地址),而不是数据本身。当你将一个引用类型变量赋值给另一个同类型的变量时,实际上是复制了引用(即内存地址),而不是数据本身。因此,两个变量都指向内存中的同一个对象,修改其中一个变量所引用的对象会影响到另一个变量。
C#中的引用类型包括:
-
类类型(Class Types):用户自定义的类
-
接口(Interfaces):一种特殊的引用类型,定义了一组方法的规范
-
数组(Arrays):无论元素是值类型还是引用类型,数组本身都是引用类型
-
委托(Delegates):用于表示对方法的引用
-
字符串(String):虽然在C#中字符串看起来像是值类型(例如,它们是不可变的),但在内部,字符串是作为引用类型处理的(即
System.String
是一个类) -
对象(Object):所有类型(包括值类型和引用类型)的基类
注意事项
-
默认情况下,当你将一个引用类型的对象赋值给另一个变量时,两个变量将引用同一个对象。这意呀着,如果你修改了其中一个变量引用的对象,那么另一个变量也会看到这些修改。
-
值类型的变量在赋值时总是复制它们的内容,因此修改一个值类型变量不会影响另一个。
-
字符串是特殊的引用类型,尽管它们以引用类型的方式在内存中存储,但一旦创建,字符串的内容就不可更改(即不可变性)。这意味着如果你尝试修改字符串的某个部分,实际上会创建一个新的字符串对象,并让这个新字符串成为变量的新值。
引用类型代码
private static void Main(string[] args) { //引用传参 //传递的是地址 string[] names = { "西游记", "丰乳臀", "活着", null, null }; for (int i = 0; i < names.Length; i++) { Console.WriteLine(names[i]); } Console.WriteLine("=============="); addBook(); } public static void addBook() { string[] names = { "西游记", "丰乳臀", "活着", null, null }; names[3] = "三国演义"; for (int i = 0; i < names.Length; i++) { Console.WriteLine(names[i]); } }