深入c# 类和结构的区别总结详解
发布时间:2023-01-25 10:27:27
类和结构的区别:
1.一个是引用类型一个是值类型
Class是引用类型,继承自System.Object类
Struct是值类型,继承自System.ValueType类,因此不具有多态性
因为结构是值类型,所以结构之间赋值可以创建新的结构,复制包含结构的变量时,讲复制所有的数据,对新的副本所作的修改都不会改变旧副本的数据,而类是引用类型,类之间的赋值只是复制引用。
2. 继承性的区别
Class支持继承,可以继承自类和接口,是完全可扩展的,除非声明sealed。否则类可以继承自其它的类的接口,自身也能被继承。
Struct没有继承性,不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确地用sealed声明,但是结构师隐式的sealed。Struct支持接口继承。
3.内部结构:
结构
类
没有默认的(无参数)构造函数,但是可以添加构造函数,结构可以声明构造函数,但是他们必须是带参数的。
有默认的构造函数
没有析构函数
有析构函数
没有abstract和sealed(因为不能继承)
可以使用abstract和sealed
不能有protected修饰符,不可以声明protected,virtual,sealed和override成员
可以声明protected,virtual,sealed,override成员
可以不使用new初始化
必须使用new初始化,struct在声明时就进行了初始化过程,所有的成员变量均默认为0或null
在结构中初始化实例字段是错误的
Struct变量使用完之后就自动解除内存分配
Class实例有垃圾回收机制来保证内存的回收处理
Struct创建的对象复制简单,直接以等号连接即可
Class对象复制分为浅复制和深复制,必须经过特别的方法来完成复制
我们可以简单地理解为class是一个可以动的机器,有行为,有多台,有继承,而struct是一个零件箱,组合了不同结构的零件,其实class和struct最本质的区别在于class是引用类型,内存分配在托管堆,而struct是值类型,内存分配在线程堆栈上,此差异导致了上述的所有的不同。
4.如何选择类和结构
(1)实现一个主要勇于存储数据的结构时,可以考虑结构
(2)Struct变量占用堆栈的空间,因此适用于数据量相对小的场合,堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。
(3)结构数组具有更高的效率
(4)结构表示如点,矩形和颜色这样轻量的对象,例如,如果声明一个含有1000个点的对象数组,则将为引用每个对象分配附加的内存,在此情况下,结构的成本较低。
(5)在表现抽象和多级别的对象层次时,类是最好的选择
(6)在大多数情况下,该类型只是一些数据时,结构师最佳的选择。


猜你喜欢
- 一、前言在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中
- android通过google API获取天气信息public class WeatherActivity extends Activity
- 1 MyBatisPlusConfigMyBatisPlus配置类。package com.config;import
- 今天给大家带来一个向右滑动销毁Activity的效果,Activtiy随着手指的移动而移动,该效果在Android应用中还是比较少见的,在I
- 本文实例讲述了C#实现软件监控外部程序运行状态的方法。分享给大家供大家参考。具体方法如下:需要 * 一个程序,用于监控另一个程序运行状态,一旦
- C#提供了多种操作文件的方案,File类中封装的静态方法,接口封装得比较人性化,隐藏了具体实现的细节,主要包括读取、写入以及追加,这些函数如
- 一、为什么会存在动态内存int data=20;//在栈空间上开辟4个字节空间char ch[5]={0};//在栈开辟5个字节连续空间上面
- 函数指针最近看android camera 的source ,发现大量的call back ,多线程,有必要对其中的基础 :函数指针复习一下
- 今天给大家带来的是仅仅使用一个TextView实现一个 * 京东、淘宝、唯品会等各种电商APP的活动倒计时。最近公司一直加班也没来得及时间去整
- // Path类 IO命名空间 静态类 不能创建对象类名.string str =@"E:\C#程序设计基础入门教程\(第十一天)
- public string check_number(string num_str)
- 前言数据库存储是我们常用的存储方式之一,对大批量数据有增、删、改、查操作需求时,我们就会想到使用数据库,Flutter中提供了一个sqfli
- 本文实例为大家分享了Android实现画板的具体代码,采用的技术是双缓冲技术,供大家参考,具体内容如下1.双缓冲技术的概念所谓的双缓冲技术其
- 微信公众号发送模版消息 背景:如下图,当用户发布需求的时候,公众号自定推送消息。例如:微信支付的时候,公众号会推送支付成功消息前提:发送模版
- 在使用Unity中的Debug.Log()进行日志输出时很不方便,在打包出来的可执行文件中没有办法看到输出,所有就想自己实现一个简易的日志输
- 简介redis 多数据源主要的运用场景是在需要使用多个redis服务器或者使用多个redis库,本文采用的是fastdep依赖集成框架,快速
- 本文实例为大家分享了C语言实现稀疏矩阵的具体代码,供大家参考,具体内容如下#include "stdio.h"#defi
- 直接贴代码: public class OSInfoMation { public static string OSBit() { try
- 滚轮选择控件Android自带的选择时间控件有点丑,往往产品和设计都比较嫌弃,希望做成ios一样的滚轮选择,下面是我在NumberPicke
- 本文讨论了Spring Data JDBC如何实现DDD中聚合根存储的设计思路,其中主要讨论了是不是每个实体都需要一个对应数据表,这种问题需