【C#视频】值类型和引用类型

本文深入探讨了C#中的值类型与引用类型的区别,包括它们的存储方式、赋值行为以及类与结构的不同特性。同时,文章还对比了堆和栈的使用场景,以及值类型和引用类型的特定属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、对象的引用

类是引用类型,结构是值类型

举例:结构版的Person的赋值 与 类版的Person的赋值

int、decimal、bool、double byte 枚举结构等类型(值类型)是传递拷贝(复制),对象(引用类型)是传递引用(传递地址)。

     class/struct  Person
    {
        string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        char _gender;
        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }
        int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        public void Show()
        {
            Console.WriteLine("{0}的{1}在宜春是最纯洁的{2}李老师",_age ,_name ,_gender );
        }
    }
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Age = 20;
            p1.Gender = '男';
            Person p2 = new Person();
            p2 = p1;

            Console.WriteLine(p1 .Age );
            Console.WriteLine(p1 .Gender );
            Console.WriteLine("====================");
            Console.WriteLine(p2.Age );
            Console.WriteLine(p2.Gender );
            Console.ReadKey();
        }

结果显示都为:20  男

值类型的值存在栈上,引用类型   栈上存的是地址,值在堆上

        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Age = 20;
            p1.Gender = '男';
            Person p2 = new Person();
            p2 = p1;
            p2.Age = 100;
            p2.Gender = '女';


            Console.WriteLine(p1 .Age );
            Console.WriteLine(p1 .Gender );
            Console.WriteLine("====================");
            Console.WriteLine(p2.Age );
            Console.WriteLine(p2.Gender );
            Console.ReadKey();
        }

struct  时,显示为20  男   和  100   女

说明:p1.Age=20;     p1.Gender='男';

P2=p1   将 p1 的值 赋值给了 p2

后又加 p2.Age=100;   p2.Gender=‘女’;  重新给 p2 赋值

class  时,显示为100  女  和  100     女

说明:

p1.Age=20;     p1.Gender='男';

P2=p1   将 p1 的地址 给了 p2   因此p1 和 p2 的值都是 20  男

后又加 p2.Age=100;   p2.Gender=‘女’;即p2 重新赋值了

因 p2 和 p1 的地址相同了,所以 p1 和 p2 的值等同

类和结构异同

同:默认都有一个无参数的构造函数

异:在类和结构中写一个有参数的构造函数时,默认的无参函数(类中的被干掉了,结构中的没被干掉)

字段赋值(结构中所有的字段全部赋值,类中可以不用吧所有字段都赋值)

2、 堆和栈的区别

栈是编译期间就分配好的内存空间,因此代码在必须就栈的大小有明确的定义;局部值类型变量 、值类型参数等都在栈内存中。

堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配堆内存的大小。

 

3、 值类型和引用类型的区别

1)将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制给对象的引用,而不复制对象本身。

2)值类型不可能派生出新的类型:所有的值类型均隐式派生自 System. ValueType。但与引用类型相同的是,结构也可以实现接口。

3)值类型不可能包含 null 值   如:int  number=null   是错误的

4)每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

继承

class Student:Person{……};

class Teacher:Person{……};

继承的符号

子类继承了父类的成员,子类还可以有自已的成员。

Person叫做父类(基类)Student 和 Teacher 叫做子类(派生类)

Student继承了Person类,Person类派生类Teacher类

注:在C#中,所有的类都直接或间接的继承了Object类。(当我们定义一个类的时候,如果没有写继承一个类,那么这个类就继承了Object类)

注:继承的传递性;继承的单根性(只有一个父类)

 

 

 

 

 

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值