目 录CONTENT

文章目录

CSharp(三) 值和引用类型

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 = "现在变成字符串";
    }
}
0

评论区