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

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.mzph.cn/news/65912.shtml

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

相关文章

Python Qt学习(九)MainWindow

源代码: # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_mainwindow.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do n…

【UE 材质】常用向量运算节点——点积、叉积、归一化

目录 一、点积 二、叉积 三、归一化 一、点积 点积,也称为内积或数量积,是一种用于计算两个向量之间关系的操作。对于两个三维向量 A(a1,a2,a3)和 B(b1,b2,b3),它们的点积可以用以下公式表示: ABa1​⋅…

大数据课程K13——Spark的距离度量相似度度量

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的距离度量和相似度度量; ⚪ 掌握Spark的欧氏距离; ⚪ 掌握Spark的曼哈顿距离; ⚪ 掌握Spark的切比雪夫距离; ⚪ 掌握Spark的最小二乘法; 一、距离度量和相似度度量 1. …

MFC中获取任务栏大小

MFC怎么获得当前屏幕大小 你可以这样 HWND hwndGetDesktopWindow();RECT rect; GetClientRect(hwnd,&rect);//可以得到桌面大小 还有就是上面所说的 int nScreenWidth, nScreenHeight; nScreenWidth GetSystemMetrics(SM_CXSCREEN); nScreenHeight GetSystemMetrics(SM_…

【Grasshopper基础15】“右键菜单似乎不太对劲”

距离上一篇文章已经过去了挺久的,很长时间没有写GH基础部分的内容了,原因其一是本职工作太忙了,进度也有些落后,白天工作累成马,回家只想躺着;其二则是感觉GH基础系列基本上也介绍得差不多了,电…

1分钟实现 CLIP + Annoy + Gradio 文搜图+图搜图 系统

多模态图文搜索系统 CLIP 进行 Text 和 Image 的语义EmbeddingAnnoy 向量数据库实现树状结构索引来加速最近邻搜索Gradio 轻量级的机器学习 Web 前端搭建 文搜图 图搜图 CLIP图像语义提取功能!

微信小程序餐饮外卖系统设计与实现

摘 要 随着现在的“互联网”的不断发展。现在传统的餐饮业也朝着网络化的方向不断的发展。现在线上线下的方式来实现餐饮的获客渠道增加,可以更好地帮助餐饮企业实现更多、更广的获客需求,实现更好的餐饮销售。截止到2021年末,我国的外卖市场…

Go语言基础语法|疑难分析及相关补充

疑难分析 1.对于range遍历的理解 eg: package main import "fmt" func main() { nums : []int{2, 3, 4} sum : 0 for i, num : range nums { sum num if num 2 { fmt.Println("index:", i, "num:", num) } } …

数据结构 -作用及基本概念

为什么要使用数据结构 学习数据结构是计算机科学和软件工程领域中非常重要的一门课程。以下是学习数据结构的几个重要原因: 组织和管理数据:数据结构提供了一种组织和管理数据的方式。通过学习不同的数据结构,你可以了解如何有效地存储和操作…

Python Tcp编程

网络连接与通信是我们学习任何编程语言都绕不过的知识点。Python 也不例外,本文就介绍因特网的核心协议 TCP ,以及如何用 Python 实现 TCP 的连接与通信。 TCP 协议 TCP协议(Transmission Control Protocol, 传输控制协议&#…

Flutter关于StatefulWidget中State刷新时机的一点实用理解

刚入门flutter开发,使用StatefulWidget踩了很多坑,就我遇到典型问题谈谈见解。 1.initState方法只会在控件初始化的时候执行一遍。 2.控件内部执行setState方法,则会每次执行build方法。 3.控件销毁会执行dispose方法,所以一些…

2023年6月电子学会Python等级考试试卷(三级)答案解析

青少年软件编程(Python)等级考试试卷(三级) 一、单选题(共25题,共50分) 1. 请选择,下面代码运行之后的结果是?( ) a = 2 b = 4 try: c = a * b print(c) except: print(程序出错!) else: print(程序正确!) A.

大模型的能力边界在哪里?

随着人工智能领域的不断发展,大型神经网络模型已经成为了研究和应用中的主要工具之一。这些大模型,尤其是像GPT-3这样的巨型语言模型,展示了令人印象深刻的自然语言处理能力,甚至能够生成高质量的文本、回答问题、模仿不同的写作风…

从入门到精通,30天带你学会C++【第六天:与或非三兄弟和If判断语句(博主目前最长文章,2514字)】(学不会你找我)

目录 前言 计算机里的真和假 与或非三兄弟 与运算(&&) 具体说明表格: 举个栗子1: 或运算(||) 具体说明表格: 举个栗子2: 非运算(!) 具体…

Linux之超强16进制命令:xxd(三十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Win 教程 Win7实现隔空投送

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络&#xff0…

独家首发!openEuler 主线集成 LuaJIT RISC-V JIT 技术

RISC-V SIG 预期随主线发布的 openEuler 23.09 创新版本会集成 LuaJIT RISC-V 支持。本次发版将提供带有完整 LuaJIT 支持的 RISC-V 环境并带有相关软件如 openResty 等软件的支持。 随着 RISC-V SIG 主线推动工作的进展,LuaJIT 和相关软件在 RISC-V 架构下的支持也…

Python|小游戏之猫捉老鼠!!!

最近闲(mang)来(dao)无(fei)事(qi),喜欢研究一些小游戏,本篇文章我主要介绍使用 turtle 写的一个很简单的猫捉老鼠的小游戏,主要是通过鼠标控制老鼠(Tom)的移动,躲避通过电脑控制的猫(Jerry)的追捕。 游戏主体思考逻辑&#xff1…

嵌入式开发-SPI通信介绍

SPI(Serial Peripheral Interface)是一种串行外设接口规范,它是由摩托罗拉公司制定的一种通讯协议。它广泛应用于微控制器、存储器和其他外设之间的通信。 SPI是一种同步串行通信协议,它支持四线通信: SCK&#xff0…

Aspose导出word使用记录

背景:Aspose系列的控件,功能实现都比较强大,可以实现多样化的报表设计及输出。 通过这次业务机会,锂宝碳审核中业务功需要实现Word文档表格的动态导出功能,因此学习了相关内容,在学习和参考了官方API文档的…