初识 C# 结构和类的区别

本文详细对比了C#中结构与类的主要区别,包括它们的存储方式、继承特性及构造函数等方面的不同。通过具体代码示例展示了值类型与引用类型的差异。

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

过去主要使用VC++, 除了默认的成员修饰符等细微差别外,VC++中的结构和类相似度很高。

 

现在在转像C#,结构和类的差别就大了:

1、结构是值类型, 在堆栈上分配地址, 类是引用类型 在堆上分配地址。

2、 结构:不能从另外一个结构或者类继承,本身也不能被继承;类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承。

3、结构: 没有默认的构造函数,但是可以添加构造函数,没有析构函数。类: 有默认的构造函数,有析构函数。

 

关于值类型和引用类型的不同,以下代码片段可以完全体现出来:

 

struct PersonStruct
{
    private string name;
    /// <summary>
    ///   Geter/Seter to name
    /// </summary>
    public String Name
    {
        set
        {
            this.name = value;
        }
    }
}

 

class PersonClass
{
    private string name;
    /// <summary>
    ///   Geter/Seter to name
    /// </summary>
    public String Name
    {
        set
        {
            this.name = value;
        }
    }
}

 

public static void Main()

 {

        PersonStruct[] persons1 = new PersonStruct[2] { new PersonStruct("a"), new PersonStruct("b") }; //新建一个2长度的PersonStruct数组
        PersonStruct[] persons2 = (PersonStruct[])persons1 .Clone();//对第一个数组浅拷贝
        persons2 [0].Name = "c"; //把被拷贝的结构数组的第一个元素的Name属性修改为'c'

        Console.WriteLine(persons1[0].Name); //将输出 'a'

 

        PersonClass[] personc1 = new PersonClass[2] { new PersonClass("a"), new PersonClass("b") }; //新建一个2长度的PersonClass数组
        PersonClass[] personc2 = (PersonClass[])personc1 .Clone();//对第一个数组浅拷贝
        personc2 [0].Name = "c"; //把被拷贝的类型数组的第一个元素的Name属性修改为'c'

        Console.WriteLine(personc1[0].Name); //将输出 'c'

}

 

从上面例子可见,对于值类型的数据进行浅拷贝,实际相当于创建了一段新的内存区域,这有点类似与C+中的深拷贝概念。拷贝和被拷贝的数据之间是不相关联的。修改拷贝的新对象的属性,并不会影响被拷贝的原始对象的属性。

 

而对于引用类型的数据类型而言,浅拷贝并不创建新的对象,而是只是建立了一个新的引用,也就是说,personc1中的元素实际上和personc2中的元素指向同样的内存区域,所以修改了 personc2[0]的属性也就同时修改了personc1[0]的属性了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值