值类型和引用类型

在C#中,数据类型被分为两大类:值类型(Value Types)和引用类型(Reference Types)。

区别

这两种类型的主要区别:在于它们在内存中的存储方式以及它们的行为方式。

值类型:存储在 栈空间 ——系统分配,自动回收,小而快

引用类型:储存在 堆空间——手动申请和释放

一 值类型

值类型变量直接存储数据。这意味着当你将一个值类型变量赋值给另一个同类型的变量时,实际上是将值复制给了新变量。因此,两个变量在内存中存储的是独立的值,修改一个变量不会影响另一个变量。

C#中的值类型包括:

  • 整型intshortlongbytesbyteuintulongchar

    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'
  • 浮点型floatdoubledecimal

    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]);
        }
    }

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值