【C#】类和结构体的区别

news/2024/9/24 6:09:21/

目录

1.区别概述

​编辑

2.细节区别

3.结构体的特别之处

4.如何选择结构体和类


1.区别概述

结构体和类的最大区别是在存储空间上,前者是值类型,存储在栈上,后者是引用类型,存储在堆上,它们在赋值上有很大的区别,在类中指向同一块空间的两个类的值会随一个类的改变而改变另一个,请看如下代码所示:

namespace test1
{//结构体Astruct A{public int a;public A(int a=0){this.a=a;}}//类Bclass B{public int b;public B(int b = 0){this.b = b;}}internal class Program{static void Main(string[] args){A a1 = new A(100);A a2 = a1;B b1=new B(100);B b2 = b1;Console.WriteLine("结构体A");Console.WriteLine("a1.a:{0}",a1.a);Console.WriteLine("a2.a:{0}", a2.a);Console.WriteLine("类B");Console.WriteLine("b1.b:{0}", b1.b);Console.WriteLine("b2.b:{0}", b2.b);a2.a = 200;b2.b = 200;Console.WriteLine("修改后");Console.WriteLine("结构体A");Console.WriteLine("a1.a:{0}", a1.a);Console.WriteLine("a2.a:{0}", a2.a);Console.WriteLine("类B");Console.WriteLine("b1.b:{0}", b1.b);Console.WriteLine("b2.b:{0}", b2.b);}}
}

运行结果如上图,我们发现修改结构体a2不会改变a1的内容,而修改类b2则会让b1的内容跟着修改,这是因为类是存在堆上的,将b2=b1时,这两个类对象同时指向堆上的同一块空间,这时改变任何一方都会引起另一方的改变。

此外,结构体和类在使用上很类似,结构体甚至可以用面向对象的思想来形容一类对象。

结构体具备着面向对象思想中封装的特性,但是它不具备继承和多态的特性,因此大大减少了它的使用频率。

结构体不具备继承特性,因此不能使用protected保护访问修饰符

2.细节区别

1.结构体是值类型,类是引用类型

2.结构体存在栈中,类存在堆中
3.结构体成员不能使用protected访问修饰符,而类可以

4.结构体成员变量申明不能指定初始值,而类可以
5.结构体不能申明无参的构造函数,而类可以
6.结构体申明有参构造函数后,无参构造不会被顶掉

7.结构体不能申明析构函数,而类可以
8.结构体不能被继承,而类可以
9.结构体需要在构造函数中初始化所有成员变量,而类随意
10.结构体不能被静态static修饰(不存在静态结构体),而类可以

11.结构体不能在自己内部申明和自已一样的结构体变量,而类可以
 

3.结构体的特别之处

结构体可以继承接口,接口是行为的抽象

4.如何选择结构体和类

1.想要用继承和多态时,直接淘汰结构体,比如玩家、怪物等等

2.对象时数据集合时,优先考虑结构体,比如位置、坐标等等
3.从值类型和引用类型赋值时的区别上去考虑,比如经常被赋值传递的对象,并且改变赋值对象,原对象不想跟着变化时,就用结构体。比如坐标、向量.旋转等等
 


http://www.ppmy.cn/news/1466855.html

相关文章

网关(Gateway)- 内置过滤器工厂

官方文档:Spring Cloud Gateway 内置过滤器工厂 AddRequestHeaderGatewayFilterFactory 为请求添加Header Header的名称及值 配置说明 server:port: 8088 spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8847username: nacos…

【Python】使用flask作为web服务器

一、flash轻量级web框架介绍 Python Flask 框架是一个轻量级的 Web 框架,它简单易用,灵活多变,非常适合用于构建小型到中型规模的 Web 应用程序。以下是 Flask 框架的详细介绍: 1、基本概念 Flask 是一个基于 Python 的微型 We…

关于nginx的一些介绍

一、Nginx 简介 中文简介文档 二、Centos 安装 Nginx 2.1 安装编译工具及库文件 $ yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel2.2 安装 pcre pcre 作用是 Nginx 支持 Rewrite 功能 $ cd /usr/local/src $ wget http://downloads.sourcef…

安装Android Studio报错unable to access android sdk add-on list的解决方案

1. 安装报错 初次安装Android Studio时,提示报错如下: unable to access android sdk add-on lis2. 报错原因 安装Android Studio时,会在默认路径下检测是否有Android SDK,如果没有的话,就会报上述错误。 3. 解决方…

03-树2 List Leaves(浙大数据结构PTA习题)

03-树2 List Leaves 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each input file contains one test c…

探索Web前端三大主流框架:Angular、React和Vue.js

探索Web前端三大主流框架:Angular、React和Vue.js 在现代Web开发中,前端框架已经成为开发者构建复杂应用的重要工具。Angular、React和Vue.js是目前最受欢迎的三大前端框架,它们各具特色,适用于不同的开发需求。本文将详细介绍这…

在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南

效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂,还通过其强大的扩展库支持丰富的后期处理效果,为3D场景增添无限魅力。本篇文章将引导您深入了…

6月软考新通知:24下集成大概率是中级蕞简单的一门

2024下半年软考6月新通知: 一、24下软考考试时间安排: 24下半年软考报名时间:8月19日-9月15日 24下半年软考考试时间:11月9-12日 24下半年软考成绩查询:12月中(预计) 二、考情分析 24上软考…