C#---第二十: partial修饰类的特性及应用

news2024/9/22 2:09:57

0.知识背景

局部类型适用于以下情况:

  • 类型特别大,不宜放在一个文件中实现。
  • 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
  • 需要多人合作编写一个类

局部类型的限制:

  • 局部类型只适用于类、接口、结构,不支持委托和枚举。
  • 同一个类型的各个部分必须都有修饰符 partial。
  • 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
  • 一个类型的各个部分必须被同时编译。

局部类型的注意点:

  • 关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
  • 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。


1. 代码结构介绍 & 校验的功能

  • 4个不同目录下面的partial 类,校验是否可以都被调用到不同类中独有的方法(Fun() 、Fun2()、Fun3()、Fun5() )
  • 在一个partial 类(SmallClass)中定义变量int,校验其他类中是否可以调用改变量
    在这里插入图片描述


2.代码部分

AnotherClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
        private const string name3 = "alien3";

        public void Fun3()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name3}\n");
        }
    }
}




NormalClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
        private const string name = "alien";
        string className = MethodBase.GetCurrentMethod().ReflectedType.Name;

        public void Fun()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name}\n");
            Console.WriteLine($"{className}----{methodName}-----{age}\n");
        }
    }
}




SpecialClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {

        private const string name2 = "alien2";

        public void Fun2()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name2}\n");
        }
    }
}



SmallClass.cs


using System.Reflection;

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
        private const string name5 = "alien5";
        public int age = 18;

        public void Fun5()
        {
            string methodName = MethodBase.GetCurrentMethod().Name;
            Console.WriteLine($"{className}----{methodName}-----{name5}\n");
        }
    }
}



MainClass.cs


using ConsoleDeomAlien.MultiClass;

namespace ConsoleDeomAlien
{
    public class MainMethod
    {
        public static void Main()
        {
            var cc = new NormalClass();
            cc.Fun();
            cc.Fun2();
            cc.Fun3();
            cc.Fun5();
            cc.age = 22;

            Console.WriteLine($"Main ---------{cc.age}");
            Console.ReadKey();
        }
    }
}



3.讲解部分

  • 每个partial 文件可以共享内容、共同组成一个类的前提是,命名空间、类名都一摸一样,如下所示。

namespace ConsoleDeomAlien.MultiClass
{
    public partial class NormalClass
    {
    }
}

  • 只要上面条件符合、发现文件在不同路径下,都可以实现共享机制。

  • 既然这个特殊的大类NormalClass需要多个文件共同维护,那每个文件肯定包含一些独有的方法。但是,只要初始化一次这个类,每个文件中独有的方法都可以被调用到
    在这里插入图片描述

  • 在SmallClass.cs 文件中定义了age 这个变量,但在NormalClass.cs文件中,也同样调用到了这个变量age。且在main方法中修改这个变量之后,这个值也变化了。

  • 每个类中定义的私有变量(private const string name)可供该类中的方法单独使用,方便与其他文件中的变量隔离。这样调用不同的方法,可以获取不同的值了。
    在这里插入图片描述

  • 在NormalClass.cs中定义的变量(string className),可以获取到调用该方法对应的class 名称.且该变量可共其他的partial 文件访问到。


string className = MethodBase.GetCurrentMethod().ReflectedType.Name;

  • 在每个方法中定义的局部变量(methodName),可以获取到该方法的名称,且这种方法名的获取方式,只能在方法中获取,在方法外不能获取到。

string methodName = MethodBase.GetCurrentMethod().Name;



4.最终输出内容

在这里插入图片描述

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

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

相关文章

信息化发展1

信息的定义 1 、信息论的奠基者香农认为: 信息是用来消除随机不定性的东西。 2 、信息的目的是用来“消除不确定的因素” 。信息是抽象于物质的映射集合。 3 、香农用概率来定量描述信息的公式如下: 信息的特征 客观性:信息是客观事物在人…

PostgreSQL分区表

什么是分区表 数据库分区表将表数据分成更小的物理分片,以此提高性能、可用性、易管理性。分区表是关系型数据库中比较常见的对大表的优化方式,数据库管理系统一般都提供了分区管理,而业务可以直接访问分区表而不需要调整业务架构&#xff0c…

QT版权查询

文章目录 QT工具版权QT模块版权查询 根据条件自动筛选: Qt Features, Framework Essentials, Modules, Tools & Add-Ons QT工具版权 Licensing QT模块版权查询 在 All Modules 中点击进入每个模块,在详细内容中一般有Lisence相关内容。 Licens…

c语言练习题35:求两个数二进制中不同位的个数

求两个数二进制中不同位的个数 //编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? //输入例子 : //1999 2299 //输出例子 : 7 //int calc_diff_bit(int m, int n) 思路: 1. 先将m和n…

Mybatis中的缓存机制(一文带你弄懂)

Mybatis中的缓存机制 Mybatis中的缓存机制概述项目结构MyBatis 一级缓存一级缓存原理代码测试什么时候一级缓存失效? Mybatis二级缓存测试代码⼆级缓存的失效⼆级缓存的相关配置 MyBatis集成EhCache Mybatis中的缓存机制 概述 缓存的作⽤:通过减少IO的⽅式&#…

数据结构--树4.2.1(二叉树)

目录 一、二叉树的存储结构 二、二叉树的遍历 一、二叉树的存储结构 顺序存储结构:二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点,并且结点的存储位置能体现结点之间的逻辑关系。 链式存储结构:二叉树每个结点最多只有两个孩…

英国选校8.27

目录 IC帝国理工学院 UCL伦敦大学学院 爱丁堡 曼彻斯特 KCL伦敦国王学院 Bristol布里斯托 华威 南安普顿 IC帝国理工学院 UCL伦敦大学学院 爱丁堡 曼彻斯特 KCL伦敦国王学院 24qs专业位置双非con雅思气候备注40 移动&个人通信 24fall不要双非? 24fall新…

通俗理解DDPM到Stable Diffusion原理

代码1:stabel diffusion 代码库代码2:diffusers 代码库论文:High-Resolution Image Synthesis with Latent Diffusion Models模型权重:runwayml/stable-diffusion-v1-5 文章目录 1. DDPM的通俗理解1.1 DDPM的目的1.2 扩散过程1.3 …

【数据结构】二叉树篇|超清晰图解和详解:二叉树的序列化和反序列化

博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: 是瑶瑶子啦每日一言🌼: 你不能要求一片海洋,没有风暴,那不是海洋,是泥塘——毕淑敏 目录 一、核心二、题目2.1:前序遍历2.2&…

超详细教程:如何在笔记本上run起大模型?没有GPU也可以!(Windows/Mac)

在笔记本上Run起大模型 好久不见的前言环境搭建Mac环境搭建conda环境python环境安装pytorch安装transformers Windows环境搭建conda环境 (可选)python环境 模型下载方式一:通过git下载方式二:直接通过文件链接下载方式三:通过huggingface官方…

LangChain-Chatchat:基于LangChain和ChatGLM2-6B构建本地离线私有化知识库

如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 自从去年GPT模型火爆以来,降低了很多个人和企业进入…

09-微信小程序 网络请求API(实现轮播广告和简易的聊天窗口)

09-微信小程序API网络请求(实现轮播广告和简易的聊天窗口) 文章目录 微信小程序API服务器域名配置注意网络相关APIrequestRequestTask 请求任务对象object.success 回调函数object.fail 回调函数案例代码(实现轮播图) WebSocket案例代码(实现…

Vue:插槽,与自定义事件

1.插槽slot <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <div id"app"><!-- <p>列表书籍</p>--> <!-- …

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉&#xff0c;但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…

如何选择合适的损失函数

目录 如何选择合适的损失函数 1、均方误差&#xff0c;二次损失&#xff0c;L2损失&#xff08;Mean Square Error, Quadratic Loss, L2 Loss&#xff09; 2、平均绝对误差&#xff0c;L1损失&#xff08;Mean Absolute Error, L1 Loss&#xff09; 3、MSE vs MAE &#xff…

C++--两个数组的dp问题(2)

1.交错字符串 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定三个字符串 s1、s2、s3&#xff0c;请判断 s3 能不能由 s1 和 s2 交织&#xff08;交错&#xff09; 组成。 两个字符串 s 和 t 交织 的定义与过程如下&#xff0c;其中每个字符串都…

matlab使用教程(26)—常微分方程的求解

1.求解非刚性 ODE 本页包含两个使用 ode45 来求解非刚性常微分方程的示例。MATLAB 提供几个非刚性 ODE 求解器。 • ode45 • ode23 • ode78 • ode89 • ode113 对于大多数非刚性问题&#xff0c;ode45 的性能最佳。但对于允许较宽松的误差容限或刚度适中的问题&…

前端vue3+typescript架构

1、vue creat 项目名称 选择自定义 选择需要的依赖 选择vue3 一路enter&#xff0c;选择eslistprettier 继续enter&#xff0c;等待安装 按步骤操作&#xff0c;项目启动成功 2、vscode安装5款插件 2、代码保存自动格式化&#xff0c;保证每个开发人员代码一致&#xff0c;根目…

关于devos勒索病毒,这些是你应该了解的,勒索病毒解密

Devos 勒索病毒是一种近年来引起广泛关注的恶意软件&#xff0c;它通过加密用户文件来实施勒索&#xff0c;给用户带来了极大的困扰。本文将介绍 Devos 勒索病毒的特征、危害、防范措施及案例分析&#xff0c;帮助大家更好地了解和应对这一威胁。 一、Devos 勒索病毒的特点 加密…

C语言——指针进阶(一)

目录 ​编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 ​编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 ​编辑 五.…