C#结构(Struct)和类(class)的区别

文章详细对比了C#中的Class(引用类型)和Struct(值类型)在内存分配、继承性、内部结构以及选择使用上的差异。Class支持继承和多态,分配在托管堆,而Struct不支持继承,分配在栈上,适用于小数据量和高效率需求。选择时,轻量级数据存储和性能优化倾向于使用Struct,复杂的抽象和层级结构则更适合Class。
摘要由CSDN通过智能技术生成

区别点

1.一个是引用类型一个是值类型

Class是引用类型,继承自System.Object类

Struct是值类型,继承自System.ValueType类,因此不具有多态性(可以继承接口)

因为结构是值类型,所以结构之间赋值可以创建新的结构,复制包含结构的变量时,将复制所有的数据,对新的副本所作的修改都不会改变旧副本的数据,而类是引用类型,类之间的赋值只是复制引用。

2. 继承性的区别

Class支持继承,可以继承自类和接口,是完全可扩展的,除非声明sealed。否则类可以继承自其它的类的接口,自身也能被继承。

Struct没有继承性,不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确地用sealed声明,但是结构是隐式的sealed。Struct支持接口继承。

3.内部结构:

结构体没有默认的(无参数)构造函数,但是可以添加构造函数,结构可以声明构造函数,但是他们必须是带参数的。

结构体没有析构函数

结构体不能有protected修饰符,不可以声明protected,virtual,sealed和override成员

结构体可以不使用new初始化,struct在声明时就进行了初始化过程,所有的成员变量均默认为0或null

在结构中初始化实例字段是错误的

Struct变量使用完之后就自动解除内存分配,Class实例有垃圾回收机制来保证内存的回收处理

Struct创建的对象复制简单,直接以等号连接即可。Class对象复制分为浅复制和深复制,必须经过特别的方法来完成复制

我们可以简单地理解为class是一个可以动的机器,有行为,有多台,有继承,而struct是一个零件箱,组合了不同结构的零件,其实class和struct最本质的区别在于class是引用类型,内存分配在托管堆,而struct是值类型,内存分配在线程堆栈上,此差异导致了上述的所有的不同。

4.如何选择类和结构

(1)实现一个主要用于存储数据的结构时,可以考虑结构

(2)Struct变量占用堆栈的空间,因此适用于数据量相对小的场合,堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。

(3)结构数组具有更高的效率

(4)结构表示如点,矩形和颜色这样轻量的对象,例如,如果声明一个含有1000个点的对象数组,则将为引用每个对象分配附加的内存,在此情况下,结构的成本较低。

(5)在表现抽象和多级别的对象层次时,类是最好的选择

(6)在大多数情况下,该类型只是一些数据时,结构是最佳的选择。

结构体的声明和使用

在c#中,我们使用struct关键字来声明一个结构体,我们声明一个名为books的结构体,在结构体中,可带有方法、字段、索引、属性、运算符方法和事件。如:

struct book
{
     private int id;
     public String name;
     private String site;
     public void setValue(int id,String name,String site)
     {
         id = id;
         name = name;
         site = site;
     }
}

结构体的使用方法

   public static void Main(string[] args)
   {
       new book().setValue(1, "cs", "cs"); //调用结构内方法
       book b;//声明b,类型为book

       b.name = "11111";
       Console.WriteLine(b.name);
   }

什么时候使用结构

我的概念模型是在项目仅仅是值类型的集合时使用结构。

堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。不过假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。

总结

结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。

所以比较小的数据时可以使用结构体来提升读取速度。而使用场景需要用到引用地址时就使用类。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,structclass区别主要在于默认的访问权限不同。具体区别如下: 1) struct默认的访问权限是公共的,而class默认的访问权限是私有的。这意味着在struct中定义的成员变量和成员函数默认是公共的,而在class中默认是私有的。\[1\] 2) 在C++中,struct可以定义成员函数,而C语言中的struct不能。这是struct在C++中的一个功能强大的特点。\[2\] 3) struct可以被继承,而C语言中的struct不能被继承。这意味着在C++中,可以使用struct来实现继承的功能。\[2\] 4) struct还可以实现多态,这也是C语言中的struct所不具备的功能。\[2\] 总的来说,C++中的structclass在用法上有相似之处,但是struct具有更多的功能和灵活性。然而,C++中保留了struct关键字主要是为了保持对C语言的兼容性。\[3\] #### 引用[.reference_title] - *1* [C++ structclass区别](https://blog.csdn.net/weixin_42291376/article/details/120619134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [c++ structclass](https://blog.csdn.net/bitcarmanlee/article/details/124338100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值