C#基础:类class与结构struct的区别

news2025/4/8 7:39:58

一、类class

类class是引用类型,可以直接赋值为null,默认值也是null

XClass xClass = null;//语法正确

    一般来说,某个类对象使用另一个类的对象赋值时,则两者共用一个内存地址【节约内存空间】,ReferenceEquals引用比较此时返回true

            XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
            XClass xClass4 = xClass3;

类的构造函数(构造方法)

如果一个类没有显示定义构造函数,则默认有一个无参构造函数,

如果一个类已定义了带参数的构造函数,如果不手动定义无参构造函数,则没有无参构造函数

特殊类String:

特殊类【字符串String】虽然是引用类型,但对字符串的更新并不会修改字符串的原实际值,

字符串作为参数传递并不能篡改原来的值,

可以认为字符串虽然是引用类型,但使用时按值类型处理

二、结构struct

结构struct是值类型,不能直接赋值为null,结构的默认值为0,false,类型名称字符串等

XStruct xStruct=null;//语法错误,不能为值类型赋值为null

如果想为值类型赋值为null,请使用可空类型Nullable<T>

public struct Nullable<T> where T : struct

比如如下代码即可编译通过:

Nullable<XStruct> xStruct = null;//可空值类型

或者简化为

XStruct? xStruct = null;//可空值类型的简化

    某个结构对象使用另一个结构的对象赋值时,则两者的内存地址完全不同,第二个结构对象新开一个内存空间,只不过内存的值完全一致【内存空间增加】,ReferenceEquals引用比较此时返回false

结构的构造函数

所有结构都自动继承抽象值类型基类ValueType,有个默认无参构造函数ValueType(),因此无法在自定义结构中定义无参构造函数

using System.Runtime.InteropServices;
using System.Security;

namespace System
{
    //
    // 摘要:
    //     为值类型提供基类。
    [ComVisible(true)]
    public abstract class ValueType
    {
        //
        // 摘要:
        //     初始化 System.ValueType 类的新实例。
        protected ValueType();

        //
        // 摘要:
        //     指示此实例与指定对象是否相等。
        //
        // 参数:
        //   obj:
        //     要与当前实例进行比较的对象。
        //
        // 返回结果:
        //     如果 true 和该实例具有相同的类型并表示相同的值,则为 obj;否则为 false。
        [SecuritySafeCritical]
        public override bool Equals(object obj);
        //
        // 摘要:
        //     返回此实例的哈希代码。
        //
        // 返回结果:
        //     一个 32 位带符号整数,它是此实例的哈希代码。
        [SecuritySafeCritical]
        public override int GetHashCode();
        //
        // 摘要:
        //     返回此实例的完全限定类型名称。
        //
        // 返回结果:
        //     完全限定的类型名称
        public override string ToString();
    }
}

值类型重写了Equals方法,如果一个值类型的具体属性值完全一致时,两个对象是相等的

三、测试控制台应用程序GenericTemplateDemo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GenericTemplateDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetWindowSize(120, 30);
            Console.WriteLine($"结构的默认值为类型名(一定不为null):{default(XStruct)},类型名为【{typeof(XStruct)}】");
            Console.WriteLine($"类的默认值为null?【{default(XClass) == null}】");
            Console.WriteLine("---------------------------------结构的Equal比较---------------------------------");
            XStruct xStruct1 = new XStruct() { Id = 5, Name = "ABC" };
            XStruct xStruct2 = new XStruct("ABC") { Id = 5 };
            Console.WriteLine($"结构一的内容{{Id:{xStruct1.Id},Name:{xStruct1.Name}}}");
            Console.WriteLine($"结构二的内容{{Id:{xStruct2.Id},Name:{xStruct2.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct1.Equals(xStruct2)}");
            Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct1, xStruct2)}");

            XStruct xStruct3 = new XStruct("修吾") { Id = 8 };
            XStruct xStruct4 = xStruct3;
            Console.WriteLine($"结构三的内容{{Id:{xStruct3.Id},Name:{xStruct3.Name}}}");
            Console.WriteLine($"结构四的内容{{Id:{xStruct4.Id},Name:{xStruct4.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct3.Equals(xStruct4)}");
            Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct3, xStruct4)}");
            Console.WriteLine("---------------------------------类的Equal比较---------------------------------");
            XClass xClass1 = new XClass() { Id = 6, Name = "毒瘴泉" };
            XClass xClass2 = new XClass("毒瘴泉") { Id = 6 };
            Console.WriteLine($"类一的内容{{Id:{xClass1.Id},Name:{xClass1.Name}}}");
            Console.WriteLine($"类二的内容{{Id:{xClass2.Id},Name:{xClass2.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个类的实例值是否相等:{xClass1.Equals(xClass2)}");
            Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass1, xClass2)}");
            Console.WriteLine();
            XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
            XClass xClass4 = xClass3;
            Console.WriteLine($"类三的内容{{Id:{xClass3.Id},Name:{xClass3.Name}}}");
            Console.WriteLine($"类四的内容{{Id:{xClass4.Id},Name:{xClass4.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个类的实例值是否相等:{xClass3.Equals(xClass4)}");
            Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass3, xClass4)}");
            Console.ReadLine();
        }        
    }

    /// <summary>
    /// 测试用的结构,结构继承ValueType,而ValueType重写了Equals(object obj)方法,因此比较
    /// 结构不允许显式定义无参的构造函数,因 结构struct一经定义,自动会生成一个无参构造函数
    /// </summary>
    struct XStruct
    {
        public XStruct(string name)
        {
            Id = 0;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }

    /// <summary>
    /// 测试用的类
    /// </summary>
    class XClass
    {
        public XClass()
        {
        }
        public XClass(string name)
        {
            Id = 0;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

四、程序运行如图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2982.html

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

相关文章

JDK的安装-详细版

大家好&#xff0c;我是研究大数据领域的 查德-常&#xff0c;大数据是一个随着数据量快速增长而应运而生的行业&#xff0c;让我来带你了解大数据吧。 JDK的安装JDK安装1.1 搜索jdk1.2 登录Oracle1.3 安装jdk1.4 环境配置1.5 验证是否安装好jdk由于粉丝中初学者比较多&#xf…

《web课程设计》用HTML CSS做一个简洁、漂亮的个人博客网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: ​​【主页——&#x1f680;获取更多优质源码】​​ &#x1f393; web前端期…

西祠胡同社区彻底消失

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 今天打开西祠胡同&#xff0c;发现网站备案注销了&#xff0c;域名(www.xici.net)停止解析了&#xff0c;半年前1元转让股权的事也不了了之&#xff0c;西祠胡同就这样静悄悄的消失了&#xff0c;连…

MongoDB 数据库(一):MongoDB的介绍与安装

目录一、MongoDB数据库的介绍与安装1.1 NoSQL数据库简介1.2 MongoDB 简介1.2.1 再议业务应用场景1.2.2 为什么要使用 MongoDB1.2.3 适用场景二、安装和使用MongoDB客户端2.1 Windows 安装 MongoDB2.2 Linux-Centos7 安装 MongoDB2.3 安装Studio 3T一、MongoDB数据库的介绍与安装…

PyCharm连接远程Docker环境

1. docker 配置 使用-p参数暴露一个端口用于ssh连接。 docker run -itd --name wangchao_paddle --gpus all -p 8899:8888 -p 8822:22 -v /data:/root/data registry.baidubce.com/paddlepaddle/paddle:2.3.0-gpu-cuda10.2-cudnn7 /bin/bash如果镜像没有ssh则需要先安装。&am…

后台获取不到请求头中token信息的解决方法

前言 项目要做单点登录功能&#xff0c;于是在shiro的基础上加入了自定义的 Filter&#xff0c;使用 JWT 自定义生成和校验token信息。 功能写好后自己在 postman 中测试了效果&#xff0c;将 token 放在 Headers 中请求后台接口&#xff08;如下图&#xff0c;还没发现问题&…

【微服务】基于Ribbon实现负载均衡

前言 我们在上篇文章中讲解了如何通过Nacos实现服务治理&#xff0c;由此引发的负载均衡的问题。这篇文章就介绍一个SpringCloud alibaba的另一个组件&#xff1a;Ribbon&#xff0c;如何通过Ribbon实现负载均衡。 负载均衡 什么是负载均衡&#xff1f; 通俗的讲&#xff0…

C语言学习笔记

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言C的面向过程和C的面向对象1.C的数据类型与常量2.C中的变量1、什么是变量&#xff1f;2、变量名字的命名规则&#…

openlayer 加载4547坐标系 以及 wfs服务数据(或其他坐标系)

1.首先查看坐标系基础信息如范围等&#xff1a;如下图&#xff1a; 2.若将地图设置成4547坐标系&#xff1a; 核心代码&#xff1a; proj4.defs("EPSG:4547","projtmerc lat_00 lon_0114 k1 x_0500000 y_00 ellpsGRS80 unitsm no_defs typecrs");register…

ModelBox姿态匹配:抖抖手动动脚勤做深呼吸

摘要&#xff1a;本案例使用Windows版本的ModelBox SDK进行二次开发&#xff0c;主要是针对姿态匹配案例开发实践。本文分享自华为云社区《姿态匹配&#xff1a;抖抖手动动脚勤做深呼吸》&#xff0c;作者&#xff1a;吴小鱼。 在之前发布的AI说ModelBox推理真的高效吗一文中&…

对于含有琥珀酰亚胺酯的叠氮试剂Azidoacetic Acid NHS Ester,N3-C5-NHS ester,N3-C3-NHS ester 知识分享

本文重点为大家总结关于含有琥珀酰亚胺酯基团的叠氮基相关试剂的性质特点&#xff0c;西安凯新生物科技有限公司​主要从Azidoacetic Acid NHS Ester、N3-C5-NHS ester、N3-C3-NHS ester进行分享。 一、Azidoacetic Acid NHS Ester CAS&#xff1a;824426-32-6 中文名&#xff…

Linux shell脚本之回顾及实用笔记

一、前言 我们从事运维的小伙伴,除了自动化运维外,在没有自动化条件下,借助shell脚本/Python脚本来提升运维效率,无疑是一个必选项,当前也可以自建自动化运维平台,我们这里还是以Linux shell脚本为主,来汇总一些常用的运维脚本,对于有基础的同学,也随本文一起回顾下相…

【学习笔记】《模式识别》2:聚类分析

聚类分析 文章目录聚类分析一、聚类分析的概念二、相似性的测度1.距离的四条基本公理2.欧氏距离&#xff08;Euclid,欧几里得&#xff09;--距离3.马氏距离&#xff08;Maharanobis&#xff09;4.马氏距离与欧氏距离之间的关系5.明氏距离&#xff08;Minkowaki&#xff09;6.汉…

4款实用的黑科技软件,白嫖党最爱,功能强大到离谱

闲话少说&#xff0c;直上干货。 1、Dism 这是一款国人研发&#xff0c;免费又好用的电脑优化工具&#xff0c;备受全球电脑爱好者追捧&#xff0c;它解决了系统安装与维护两大痛点问题——自定义设置与优化&#xff0c;相当于给电脑请了免费“保姆”。从系统安装到调校&#x…

LabVIEW基础-VI Scripting

文章目录使用过程前面板界面修改属性节点VI属性无输入时默认当前VI。输入VI引用的静态方法输入VI引用的动态方法获取对象引用从VI获取前面板所有控件的引用设置修饰物的前景色获取选项卡1上所有的数值控件并设置标签前景色从VI获取前面板选项卡的引用-转换为特定的类-获取选项卡…

B+树的插入、删除和分裂,注意国内教材和国外的对于B+树的定义的不同

B树 1 国内教材上B树的定义 一棵 m 阶的B树满足 (考研教材)&#xff1a; 每个非叶子结点最多有 m 棵子树&#xff08;孩子结点&#xff09;根结点至少有2棵子树 (1层除外)&#xff0c;非叶结点至少有 m/2 (向上取整) 棵子树结点的子树的个数与关键字的个数相等: 介于 m/2 (向…

DSL查询文档

目录一、DSL查询语法二、DSL查询分类全文检索查询精确查询地理坐标查询复合查询复合查询——fuction score复合查询——Boolean Query三、搜索结果处理排序分页高亮一、DSL查询语法 DSL Query基本语法 查询成功 二、DSL查询分类 DSL Query的分类 Elasticsearch提供了基于…

【数据结构基础】之树的介绍,生动形象,通俗易懂,算法入门必看

前言 本文为 数据结构基础【树】 相关知识&#xff0c;下边将对树的定义与相关概念&#xff0c;二叉树的定义、特点与性质&#xff0c;二叉树的存储结构&#xff0c;二叉树的遍历&#xff0c;二叉查找树&#xff0c;平衡二叉树&#xff0c;红黑树&#xff0c;B-树与B树等进行详…

六十九、Vue3

Vue3一 Vue3的变化二 创建Vue3项目的两种方式2.1 vue-cl创建2.2 vite创建三 常用API3.1 setup3.2 ref和reactive3.3 计算和监听属性3.4 生命周期3.5 自定义hook函数一 Vue3的变化 性能的提升 打包大小减少41% 初次渲染快55%, 更新渲染快133% 内存减少54% 源码的升级 使用Proxy…

Spring Boot 并行任务,这才是优雅的实现方式!

Spring Boot 的定时任务&#xff1a; 第一种&#xff1a;把参数配置到.properties文件中&#xff1a; 代码&#xff1a; package com.accord.task;import java.text.SimpleDateFormat; import java.util.Date;import org.springframework.scheduling.annotation.Scheduled; …