C#中结构struct能否继承于一个类class,类class能否继承于一个struct

news2024/11/16 11:29:36

C#中结构struct能否继承于一个类class,类class能否继承于一个struct

答案是:都不能。

第一种情行,尝试结构继承类

报错:接口列表中的类型"XX"不是接口interface。

一般来说,都是结构只能实现接口,不能继承于类

如下代码片段:【尝试结构继承类】

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

namespace DemoClassAndStruct
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadLine();
        }
    }

    class TestClass  
    {
        public int Id;
        public string TestName { get; set; }
    }
    struct TestStruct : TestClass
    {
        public int TestId;
        public TestClass testClass { get; set; }
    }
}

我们发现,无法编译,报错:接口列表中的类型"XX"不是接口interface(或者说继承于一个接口)

第二种情形:尝试类继承结构

类class也不能继承于结构struct,错误信息:类无法从密封类型派生

如下代码片段:【尝试类继承结构】

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

namespace DemoClassAndStruct
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadLine();
        }
    }

    class TestClass : TestStruct
    {
        public int Id;
        public string TestName { get; set; }
    }
    struct TestStruct 
    {
        public int TestId;
        public TestClass testClass { get; set; }
    }
}

仍然无法编译通过

在C#设计中,所有的结构stuct都特殊的认为是一种轻量型的密封类,密封类sealed是无法被继承的

比如常见的字符串String就是一个密封类

public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<String>, IEnumerable<char>, IEquatable<String>

所谓继承,类似于一种从属关系【is-a】

我们提到继承(派生)都是说的是类class,也从来没听说过有结构可以继承的

比如,猫是一种动物,而动物就不一定是猫了

我们以结构 部分数组ArraySegment为例,我们发现结构只能实现接口,也不能继承于类

public struct ArraySegment<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IReadOnlyList<T>, IReadOnlyCollection<T>

同样,类也不能继承于结构,但类可以继承于其他非密封类,同时实现多个接口。

C#虽然是单继承【父类最多只有一个】,但可以实现多个接口,通过这样来伪装成多继承,实现多种复杂的业务逻辑

类class与结构struct互相不能继承的原因:

结构体是值类型,分配在栈stack上,内存是独占的,两个结构分配在不同的内存区域

篡改其中一个结构的值,并不能影响另一个结构的值。【结构是两条不同的河流】

基础数据类型int,double,DateTime都是结构 

而类是引用类型,所以类的资源是在堆heap上,两个类分配在相同的内存区域,

篡改其中一个类的值,导致另一个类的值自动篡改。【类是同一条河流】

string字符串虽然是类,但是编译器为了对字符串进行优化,处理逻辑反而和结构一样

如果结构可以继承类的话,相当于heap堆的东西复制到栈上,编译器就紊乱了,编译器纠结到底是不同的河流 还是 同一条河流。

同样类可以继承结构的话,相当于栈stack的东西复制到堆上,编译器一样也会紊乱,编译器纠结到底是不同的河流 还是 同一条河流。

类与结构使用场景

C#中的结构体通常是轻量级的数据类型,用于存储简单的值或者小的数据集合。而类则更适合表示复杂的对象或者具有丰富行为和状态的组件。这也是为什么结构体不适合被类继承的一个原因。

一般来说,当数据类型较小且需要频繁创建并传递时,例如表示坐标Coordinate或颜色Color等简单的值类型,使用结构体更加合适,因为它们可以被分配在栈上,速度更快,且不需要垃圾回收。此外,结构体具有内存对齐的特性,可以减少内存碎片和访问时间。

而当数据类型较大、有复杂的行为和状态,并且需要被多个对象共享时,使用类更加合适。类可以使用继承、多态和抽象等面向对象的特性,可以更好地组织和管理代码,实现高内聚低耦合的设计。

总的来说,如果需要表示简单的值类型并需要高效率地操作及传递数据,则使用结构体更加合适;如果需要表示复杂的对象并需要更加灵活的行为,则使用类更加合适。

是否可以继承关系如下图:(实现接口我们也认为是一种继承)

A继承于B类class【B】结构struct【B】接口interface【B】
类class【A】可以继承无法继承可以继承
结构struct【A】无法继承无法继承可以继承
接口interface【A】无法继承无法继承可以继承

类class作为结构struct的成员变量,结构struct作为类class的成员变量

同样,类对象可以作为结构的成员变量,结构的实例也可以作为类的成员变量,

结构对象 不能与null直接比较,如果结构对象与null比较,请使用可空类型

Nullable<TestStruct> 或者 TestStruct?

测试代码:

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

namespace DemoClassAndStruct
{
    class Program
    {
        static void Main(string[] args)
        {
            TestStruct testStruct = new TestStruct();
            Console.WriteLine(testStruct.testClass == null);
            testStruct.Print();

            TestClass testClass = new TestClass();
            Console.WriteLine(testClass.testStruct.TestId);
            testClass.Print();
            Console.ReadLine();
        }
    }

    class TestClass 
    {
        public int Id;
        public string TestName { get; set; }

        public TestStruct testStruct { get; set; }

        public void Print()
        {
            Console.WriteLine("这是测试类");
        }
    }
    struct TestStruct 
    {
        public int TestId;
        public TestClass testClass { get; set; }

        public void Print() 
        {
            Console.WriteLine("这是测试结构");
        }
    }
}

测试运行如图:

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

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

相关文章

[UE5]安卓调用外置摄像头拍照(之显示画面)

目录 部分参考文献&#xff08;有些有用的我没标&#xff0c;没放上来&#xff09; 要点 总蓝图 结果 部分参考文献&#xff08;有些有用的我没标&#xff0c;没放上来&#xff09; 【UE】获取USB摄像头画面_虚幻捕获硬件摄像头-CSDN博客 UE4安卓调用摄像头拍照确保打…

SQL注入攻击是什么?如何预防?

一、SQL注入攻击是什么&#xff1f; SQL注入攻击是一种利用Web应用程序中的安全漏洞&#xff0c;将恶意的SQL代码插入到数据库查询中的攻击方式。攻击者通过在Web应用程序的输入字段中插入恶意的SQL代码&#xff0c;然后在后台的数据库服务器上解析执行这些代码&#xff0c;从而…

信息学一周赛事安排

本周比赛提醒 本周有以下几场比赛即将开始&#xff1a; 1.ABC-356 比赛时间&#xff1a;6月1日&#xff08;周六&#xff09;晚20:00 比赛链接&#xff1a;https://atcoder.jp/contests/abc356 2.ARC-179 比赛时间&#xff1a;6月2日&#xff08;周日&#xff09;晚20:00 …

K8s中配置使用ingress

Ingress是什么 在Kubernetes中&#xff0c;Ingress是一种用于将外部流量路由到集群内部服务的API对象。它通常与Ingress控制器一起使用&#xff0c;Ingress控制器负责根据Ingress规则路由外部流量到不同的服务上。   Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由…

C++容器之多重映射(std::multimap)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 insert3.6 erase3.7 swap3.8 clear3.9 emplace3.10 emplace_hint3.11 key_comp3.12 value_comp3.13 find/count3.14 lower_bound/upper_bound/equal_range3.15 get_allocator1 概述 多重…

YOLOv10最详细全面讲解1- 目标检测-准备自己的数据集(YOLOv5,YOLOv8均适用)

YOLOv10没想到出来的如此之快&#xff0c;作为一名YOLO的爱好者&#xff0c;以YOLOv5和YOLOv8的经验&#xff0c;打算出一套从数据集装备->环境配置->训练->验证->目标追踪全系列教程。请大家多多点赞和收藏&#xff01;&#xff01;&#xff01;YOLOv5和YOLOv8亲测…

使用Ollama和Open WebUI管理本地开源大模型的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月27日12点20分 &#x1f004;️文章质量&#xff1a;96分 目录 ✨️Open-WebUI介绍 优点 &#x1f4a5;部署教程…

linux部署运维1——centos7.9离线安装部署web项目所需的依赖环境,包括mysql8.0,nginx1.20,redis5.0等工具

在实际项目部署运维过程中&#xff0c;如果是云服务器&#xff0c;基本安装项目所需的依赖环境都是通过yum联网拉取网络资源实现自动化安装的&#xff1b;但是对于一些特殊场合&#xff0c;在没有外部网络的情况下&#xff0c;就无法使用yum命令联网操作&#xff0c;只能通过编…

Redis连接池

本次实现的Redis连接池是一个单例且多线程安全的连接池。 主要实现的功能为&#xff1a;读取配置&#xff0c;将配置中对应建立redis连接并加入到连接池中&#xff0c;然后从连接池中取出连接使用。每当配置进行修改&#xff0c;重新往池子中加入连接。 通用类 实现一些基础都…

将文件批量重命名001到100?怎么批量修改文件夹名字?这四款工具不要错过!

你们有没有遇到过需要批量修改文件&#xff08;文件夹&#xff09;名的情况&#xff1f;从网上下载一些文件都会带有一些后缀名字。大量的文件&#xff0c;一个一个修改重命名的话&#xff0c;这简直是个头疼的事情。市面上虽然有很多批量文件重命名工具&#xff0c;但要么收费…

勒索软件统计数据揭示了网络勒索的惊人速度

本文通过各种报告摘录&#xff0c;提供了有关当前勒索软件形势的统计数据和见解。 全球勒索病毒危机加剧 NTT安全控股《2024全球威胁情报报告》&#xff08;2024年5月&#xff09; 据NTT安全控股公司的《2024年全球威胁情报报告》显示&#xff0c;勒索软件和勒索事件在2023年激…

静态测试---基于WorkList的活跃变量分析

本文主要用于记录在活跃变量分析实验中的报错及解决&#xff0c;涉及静态测试的详细原理内容较少&#xff0c;编译运行底层逻辑偏多。 一、实验要求 1&#xff09;使用llvm基于框架实现一个基于WorkList的活跃变量分析demo。变量在某个程序点有两种状态&#xff0c;live 或 dea…

在PyCharm中,不希望新建Python文件自动打开Python控制台

很久没更新水一下 第一步编辑配置 第二步编辑配置模板 第三步取消勾选 第四步确定

MySQL 解决登录报错 - 错误1130- Host xxx is not allowed to connect to this server

1、原因 没有给远程连接权限 2、解决 2.1 打开命令行提示符界面输入命令cd C:\Program Files\MySQL\MySQL Server 8.0\bin\ 2.2 连接 MySQL 数据库 输入命令 mysql -u root -p &#xff0c;然后输入密码 回车登录 2.3 查看当前表中的数据库 show databases;查看当前使用的数…

国内外专业权威最厉害的易经姓名学大师颜廷利:从零售与批发到生活智慧

国内外最专业最权威最厉害的易经姓名学大师颜廷利&#xff1a;从零售与批发到生活智慧 在经济的快速发展中&#xff0c;"零售"与"批发"作为商业运作的两大支柱&#xff0c;早已融入我们的日常语言。然而&#xff0c;当我们以中文的韵味倒读"零售"…

动手学深度学习24 AlexNet

动手学深度学习24 AlexNet 1. AlexNet传统机器学习AlexNet 2. 代码3. QA 1. AlexNet 传统机器学习 AlexNet AlexNet & LeNet对比 加了三层隐藏层&#xff0c;通道数和全连接层单元数更多 计算需要的浮点数&#xff0c;10亿次浮点数计算。 2. 代码 import torch fro…

大气污染溯源算法及其技术实现

污染溯源基础概念知识 大气污染溯源是指识别并追踪污染物的来源及其传输过程&#xff0c;以确定造成大气污染的根本原因和污染物传播路径的技术和方法。这对于制定有效的控制和减轻污染策略至关重要。大气污染的溯源主要涉及以下几个方面&#xff1a; 污染源识别&#xff1a;…

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 输入一个字典&#xff0c;要求将该字典的键和值对换。&#xff08;注意&#xff0c;字典中有键的值是重复的&#xff09; 输入&#xff1a; 一行&#xff0…

详解 HTML5 服务器发送事件(Server-Sent Events)

HTML5 服务器发送事件&#xff08;server-sent event&#xff09;允许网页获得来自服务器的更新。 EventSource 是单向通信的&#xff08;是服务器向客户端的单向通信&#xff0c;客户端接收来自服务器的事件流&#xff09;、基于 HTTP 协议&#xff08;EventSource 是基于标准…

提升B端图表设计技能:教程分享

图表是数据可视化的常用表现形式&#xff0c;是对数据的二次加工&#xff0c;可以帮助我们理解数据、洞悉数据背后的真相&#xff0c;让我们更好地适应这个数据驱动的世界。本期就来带大家学习图表的设计及构成&#xff0c;帮助大家更好的理解图表设计。 设计教程源文件http:/…