C#3 分部方法,简单标记一下
如果我问你,如果一个普通的类实现了一个接口方法,但是这个类的实例却访问不到这个接口的方法,这种情况你遇到过吗?有时候,你可能在使用分部方法时就会发现这么一个现象。
C#3 中出现了 “分部方法” ,工作了好几年一直没用过,可能不咋实用,也有可能是工作中没有遇到这种场景,分部类倒是用了不少。最近看了一下,内容简单,标记一下。
我们 分部方法 和分部类有点类似的是 也是使用的关键字 partial ,不过不同的是 部分方法 不能有访问修饰符 (像public) 或者 virtual ,abstract,override,new,sealed,extern 。
而分部类是没有这个限制。那么你应该会想这个方法,是会像接口中定义的没法带修饰符方法一样 天生是公用的, 还是像普通类中 是私有的呢,我迫不及待的做了个代码,结局倾向了后者。
//文件1中
public partial class People
{
public People(string arg)
{
Speak($"我被构造了,带着{arg}");
} partial void Speak(string paramStr);
}
//文件2中
public partial class People
{
partial void Speak(string paramStr)
{
Console.WriteLine($"收到参数{params}");
}
}
测试
class Test
{
static void Main()
{
People p= new People("2019到了");
//p.Speaks("Hello"); 访问不到
Console.ReadKey();
}
}
上面是我们的使用例子,部分方法 限制了我们的方法不能有返回值,只能是void的方法,且不能获取out参数,它必须是私有的,可以是静态的或者泛型。
文件1中 分部方法 的申明和抽象方法相同,只提供了partial修饰符的签名而没有实现,以分号结尾。我们分析文件1中的IL代码,发现构造函数中没有任何痕迹。
接下来,我们看下如果定义接口,然后实现的时候使用分部方法呢。
public interface IPeople
{
void Speaks();
}
//文件1
public partial class People:IPeople
{
partial void Speaks();
}
//文件2
public partial class People : IPeople //接口可写可不写
{
void IPeople.Speaks()
{
Console.WriteLine("哎呀,2019都来了");
}
}
我们发现 实现接口需要显式实现。然后我们调用看看:
class Test
{
static void Main()
{
People p2 = new People();
// p2.Speaks(); 访问不到
}
p2访问不到实现的接口方法。当然,如果再定义一个子类,子类的实例也是访问不到的。那么怎么才能访问到呢,你一定会这么写:
class Test
{
static void Main()
{
IPeople p1 = new People();
p1.Speaks(); // 完全ok
}
所以你总的感觉下来,这个东西限制还是蛮大的。这个特性特别适用那些自动生成代码和手动写代码一起交互场景。概况的说,C#3的分部方法让生成代码可以和手写代码以一种丰富的方式进行交互,而不会产生任何性能上的损失,可以说是C#2分部类一种自然的延续。
C#3 分部方法,简单标记一下的更多相关文章
- C# partial修饰符_分部类_分部方法
今天翻了翻书,发现自己还是遗留下不少基础性的东西,老实说,不管一些基础的东西用到不用到都很应该了解,因为基础毕竟学习量不是很大. 一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多 ...
- c# partial 分部类和分部方法
一.partial 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.修饰符不可用于委托或枚 ...
- 分部类,分部方法 - 修饰符partial
一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多个源文件中,每个源文件只包含类型定义的一部分. 当使用自动生成的源时,无须重新创建源文件便可将代码添加到类中.Visual Stu ...
- [C#学习笔记]分部类和分部方法
知识在于积累. 前言 好久没写博客了,因为在看<CLR via C#>的时候,竟然卡在了分部方法这一小节几天没下去.今天重新认真阅读,有些感悟,所以在此记录. 然后. 每天早晨第一句,&l ...
- 利用partial关键字声明分部类和分部方法
一.分部类 1.分部类的定义:简单的说,分部类就是把一个类拆分成多个类,每个类文件只包含其中的一部分,类.结构.接口.方法都可以拆分,在定义的时候加上partial修饰符. 注意:分部类必须属于同一命 ...
- 分部方法 partial
当有如下这样类似的情况出现的时候,可以有更好的优化方式来处理,那就是分部方法 class PartOld { string name; public virtual void OnChangeName ...
- MongoDB中insert方法、update方法、save方法简单对比
MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用 ...
- 操作文件方法简单总结(File,Directory,StreamReader,StreamWrite )
对于文件夹,文档的操作一直处于一知半解状态,有时间闲下来了,好好练习了一把,对文档,文件的操作有了一个基本的认知, 若要深入了解,还是得通过实际的项目才行了,好了废话不多说,上酸菜!! 注:红色标题为 ...
- C# 分部类与分部方法
一.定义 分部方法是指能够使编码人员跨多个代码文件实现类型的语法.简而言之.它可以让我们在一个文件中构建方法原型,而在另一个文件中实现 使用分部方法和分部类需要使用关键词partial,且紧靠在cla ...
随机推荐
- Linux字符界面安装图形界面XWindow
https://jingyan.baidu.com/article/219f4bf790f4c7de442d3825.html
- numpy,scipy,pandas 和 matplotlib
numpy,scipy,pandas 和 matplotlib 本文会介绍numpy,scipy,pandas 和 matplotlib 的安装,环境为Windows10. 一般情况下,如果安装了Py ...
- Altium Designer如何统一调整标号大小,在pcb环境下
- 51NOD——N 1107 斜率小于0的连线数量
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1107 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 ...
- bootstrap课程5 bootstrap中的组件使用的注意事项是什么
bootstrap课程5 bootstrap中的组件使用的注意事项是什么 一.总结 一句话总结: 1.img-responsive的作用是什么(其实还是要多看手册)? 看起来像width=100%的效 ...
- maven 配置Project Facets时further configuration available不出来问题
如果下边的 further configuration available不出来 把Dynamic web module 去掉勾选,应用与项目,然后再点开项目的properties,再选中Dynami ...
- vue-cli 构建vue项目
师父说,咱们还是要用vue-cli 去构建前端项目.然后我就开始了 懵逼之旅. 今天上午主要就是搞懂用webpack和vue-cli怎么搭建 运行项目 首先找到了咱们博客园 园友的博客,提供了大概五个 ...
- zabbix自定义监控mysql
创建用户: use mysql; grant all privileges on *.* to 'zabbix'@'%' identified by 'zabbixpasswd'; grant all ...
- 10、V4L2摄像头获取单幅图片测试程序(MMAP模式)
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h> ...
- swift学习第十一天:类的定义
一: 主要内容 类的介绍和定义 类的属性 类的构造函数 一. 类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定义类呢? class是Swif ...