CSharp(三) 值和引用类型
值类型
数据直接存储在变量中,存储在 栈 上。
类型
关键字
说明
范围/示例
整数
byte
无符号 8 位
0 ~ 255
整数
sbyte
有符号 8 位
-128 ~ 127
整数
short
无符号 16 位
0 ~ 65535
整数
ushort
有符号 16 位
-32768 ~ 32767
整数
int
无符号 32 位
0 ~ 4194967295
整数
uint
有符号 32 位
-2147483648 ~ 2147483647
整数
long
无符号 64 位
0 ~ 18446744073709551615
整数
ulong
有符号 64 位
-9223368547758 ~ 9223372036854775807
浮点
float
单精度
后缀 f ,如 3.14f
浮点
double
双精度
后缀 d ,如 3.14159
高精度
decimal
128 位十进制
后缀 m ,如 199.99m
布尔
bool
真/假
true / false
字符
char
单个 Unicode 字符
'A' , '中'
枚举类型(Enum)
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
Season s = Season.Spring;
结构类型 (Struct)
struct Point
{
public int X;
public int Y;
}
Point p = new Point();
p.X = 10;
p.Y = 20;
可空值类型(Nullable)
int? age = null; // 可空 int
bool? flag = null; // 可空 bool
double? price = 99.9; // 可空 double
引用类型
数据存储在堆上,变量中存储的是数据的引用。也就是地址
类类型(Class)
类型
说明
object
所有类型的基类
string
字符串(不可变)
自定义 class
用户定义的类
// string
string name = "张三";
string path = @"C:\Users\Admin"; // 逐字字符串
// object
object obj = 100; // 可以装任何类型
object obj2 = "hello";
接口类型(Interface)
interface IAnimal
{
void Speak();
}
class Dog : IAnimal
{
public void Speak() => Console.WriteLine("汪汪");
}
数组类型(Array)
int[] numbers = new int[5]; // 一维数组
int[,] matrix = new int[3, 3]; // 二维数组
string[] names = { "张三", "李四" }; // 初始化
委托类型(Delegate)
delegate void MyDelegate(string msg);
// 内置委托
Action<string> action = msg => Console.WriteLine(msg);
Func<int, int, int> add = (a, b) => a + b;
特殊类型
类型
说明
示例
dynamic
动态类型,运行时解析
dynamic d = 10; d = "hello";
var
隐式类型,编译器推断
var x = 10; // 编译为 int
值类型与引用类型对比
特性
值类型
引用类型
存储位置
栈(Stack)
堆(Heap)
存储内容
实际数据
引用(内存地址)
赋值行为
复制完整数据
复制引用(指向同一对象)
默认值
0 / false
null
继承
不能继承(密封)
可以继承
典型代表
int, double, bool, struct, enum
string, class, array, interface
类型选择建议
场景
推荐类型
普通整数
int
大整数
long
小数/科学计算
double
货币/金融
decimal
真/假判断
bool
单个字符
char
文本
string
可能为空的值
int? , double?
不确定类型
var (编译时确定)或 object
运行时动态
dynamic
查看变量类型
int num = 10;
Console.WriteLine(num.GetType()); // System.Int32
Console.WriteLine(num.GetTypeCode()); // Int32
// 类型判断
if (num is int) { }
if (obj is string s) { } // 模式匹配
练习
class Program
{
static void Main()
{
// ========== 值类型 ==========
int age = 25; // 整数
double height = 1.75; // 浮点数
decimal salary = 5000.50m; // 高精度货币
bool isStudent = true; // 布尔
char grade = 'A'; // 字符
// 值类型赋值:复制数据
int a = 10;
int b = a; // b 得到 10 的副本
b = 20; // a 仍然是 10
// ========== 引用类型 ==========
string name = "张三"; // 字符串
int[] scores = { 90, 85, 88 }; // 数组
// 引用类型赋值:复制引用
int[] arr1 = { 1, 2, 3 };
int[] arr2 = arr1; // arr2 指向 arr1 的同一个数组
arr2[0] = 100; // arr1[0] 也变成 100!
// ========== 可空类型 ==========
int? nullableInt = null;
nullableInt = 10;
// ========== dynamic ==========
dynamic dyn = 100;
dyn = "现在变成字符串";
}
}
评论区