【C#】类和对象的区别

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.mzph.cn/bicheng/19593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

JavaSE:异常

1、什么是异常 在生活当中,不管是人还是动物又或是植物,都会生病;在程序中也是,作为程序猿,虽然我们会尽力将程序写的完美,可难免会出现一些问题~ 在程序执行过程中,发生的一些不正常行为&…

Windows系统安装openvino(2024.1.0)

一、openvino下载: 下载地址:下载英特尔发行版 OpenVINO 工具套件 (intel.cn) 下载完之后将压缩包解压,然后重命名文件夹为openvino_2024.1.0。 二、环境配置 以python环境为例:(建议使用moniconda虚拟环境来安装&am…

Android 图表开发开源库 MPAndroidChart 使用总结

1. 引言 电视项目中需要一个折线图表示节电数据变化情况,类比 H5 来说,Android 中也应该有比较成熟的控件,经过调研后,发现 MPAndroidChart 功能比较强大,网上也有人说可能是目前 Android 开发最好用的一个三方库了&a…

【力扣】LCR 130. 衣橱整理

一、题目描述 二、算法思路 这是⼀道非常典型的「搜索」类问题。 我们可以通过「深搜」或者「宽搜」,从 [0, 0] 点出发,按照题目的要求(选择 向右移动一格 或 向下移动一格,但不能移动到衣柜之外 )一直往 [m - 1, …

详解Spring IoCDI(二)

目录 承接上文:详解Spring IoC&DI (一) 1.IoC详解 1.1方法注解Bean 1.2方法注解要配合类注解使用 1.3定义多个对象 1.4重命名Bean 1.5扫描路径 2.DI详解 2.1DI与IoC的关系 2.2属性注入 2.3构造方法注入 2.4Setter注入 2.5 三…

代码随想录算法训练营第四十五天|1049.最后一块石头的重量II、494.目标和、 474.一和零

1049.最后一块石头的重量II 文档讲解:代码随想录 题目链接:. - 力扣(LeetCode) 本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 和昨天讲解的416. 分割等和…

visual studio code 全局搜索

VScode写代码的时候,会经常性的需要进行查找代码,那么怎么在Visual Studio Code中进行查找呢,下面就来大家vscode全局搜索的方法。 想要在vscode全局搜索进行全局搜索,使用快捷键CTRLSHIFTF即可进行搜索,也可以在左边…

哪吒监控+cfcdn+ 反代grp端口

哪吒监控cfcdn 反代grp端口 背景: 哪吒监控:感觉VPS线路不稳定,为了打消自己潜意识,希望量化延迟。 cfcdn:隐藏真实站点,保障小鸡隐秘安全 反代grpc端口: 反代grpc到支持https(TLS)的端口,这…

Tomcat启动闪退问题及解决方法

Tomcat启动闪退问题可能由多种原因引起,以下是一些常见的原因及相应的解决方法,按照清晰的结构进行归纳: 一、环境变量问题 Java环境问题:Tomcat依赖于Java环境,如果JDK未正确安装或环境变量配置不正确,会…

Elasticsearch 认证模拟题 - 3

1、题目 有一索引有 3 个字段,请写一个查询去匹配这三个字段,并且将三个字段的评分相加作为最后的总评分 # 创建索引 PUT task {"mappings": {"properties": {"fielda":{"type": "text"},"fie…

TrueNAS开启SSH登录ROOT

简介: 从 SCALE Bluefin 22.12.0 开始,为了加强安全性并遵守联邦信息处理标准 (FIPS),root帐户登录已被弃用。所有 TrueNAS 用户都应创建具有所有必需权限的本地管理员帐户,并开始使用它来访问 TrueNAS。当根用户密码被禁用时,只有管理用户帐户才能登录 TrueNAS Web 界面。…

从零学算法2965

2965. 找出缺失和重复的数字 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个…

轮状病毒简介-卡梅德生物

轮状病毒是一种非常常见的病毒,主要影响婴幼儿和小孩,引起严重的胃肠炎,表现为严重腹泻、呕吐、发烧和脱水。这种病毒全球流行,是全世界五岁以下儿童因腹泻导致死亡的主要原因之一。轮状病毒属于Reoviridae家族,具有双…

逻辑回归【python,机器学习,算法】

逻辑回归是一种有监督的学习分类算法,用于预测目标变量的概率。目标或因变量的性质是二分法的,这意味着将只有两个可能的类。主要解决二分类问题。 主要步骤有三个: 求线性回归曲线。通过 sigmoid 函数将线性回归曲线转为 0-1 范围函数。 …

机器学习-11-使用kaggle命令下载数据集和操作指南

参考kaggle API 命令下载数据集 参考Kaggle操作完整指南(2023版) 参考Kaggle如何入门? 1 kaggle操作指南 Kaggle 是一个流行的数据科学竞赛平台。由 Goldbloom 和 Ben Hamner 创建于 2010 年。为什么这两个家伙要创立这样一个平台呢? 数据科学社区一直有这样一个难题:对…

低代码开发平台(Low-code Development Platform)的模块组成部分

低代码开发平台(Low-code Development Platform)的模块组成部分主要包括以下几个方面: 低代码开发平台的模块组成部分可以按照包含系统、模块、菜单组织操作行为等维度进行详细阐述。以下是从这些方面对平台模块组成部分的说明: …

docker安装mysql8和mysql5.7

1.docker安装mysql5.7,请点击此链接 2.docker安装mysql8并挂载数据卷 docker pull mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -v /mqq/mysql8/datadir:/var/lib/mysql -d…

虚拟dom的理解

由普通的js对象来描述dom对象,是对于真实dom的映射,因为不是真实的dom对象所以叫虚拟dom。因为js处理数据的速度比操作dom的速度更快,性能更好,所以让现代这些react vue 等框架都采用了虚拟dom。 key值是唯一性的,在虚拟dom树进行…

【喜报】科大睿智服务企业通过CMMI3级认证

​北京建投科信科技发展股份有限公司(以下简称“北京建投科技” )前身为北京银帝科技发展公司,成立于1993年,注册资本6,000万元,为中国建银投资有限责任公司(简称“中国建投”)的成员企业建投华…