如果我问你,如果一个普通的类实现了一个接口方法,但是这个类的实例却访问不到这个接口的方法,这种情况你遇到过吗?有时候,你可能在使用分部方法时就会发现这么一个现象。

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 分部方法,简单标记一下的更多相关文章

  1. C# partial修饰符_分部类_分部方法

    今天翻了翻书,发现自己还是遗留下不少基础性的东西,老实说,不管一些基础的东西用到不用到都很应该了解,因为基础毕竟学习量不是很大. 一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多 ...

  2. c# partial 分部类和分部方法

    一.partial 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.修饰符不可用于委托或枚 ...

  3. 分部类,分部方法 - 修饰符partial

    一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多个源文件中,每个源文件只包含类型定义的一部分. 当使用自动生成的源时,无须重新创建源文件便可将代码添加到类中.Visual Stu ...

  4. [C#学习笔记]分部类和分部方法

    知识在于积累. 前言 好久没写博客了,因为在看<CLR via C#>的时候,竟然卡在了分部方法这一小节几天没下去.今天重新认真阅读,有些感悟,所以在此记录. 然后. 每天早晨第一句,&l ...

  5. 利用partial关键字声明分部类和分部方法

    一.分部类 1.分部类的定义:简单的说,分部类就是把一个类拆分成多个类,每个类文件只包含其中的一部分,类.结构.接口.方法都可以拆分,在定义的时候加上partial修饰符. 注意:分部类必须属于同一命 ...

  6. 分部方法 partial

    当有如下这样类似的情况出现的时候,可以有更好的优化方式来处理,那就是分部方法 class PartOld { string name; public virtual void OnChangeName ...

  7. MongoDB中insert方法、update方法、save方法简单对比

    MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用 ...

  8. 操作文件方法简单总结(File,Directory,StreamReader,StreamWrite )

    对于文件夹,文档的操作一直处于一知半解状态,有时间闲下来了,好好练习了一把,对文档,文件的操作有了一个基本的认知, 若要深入了解,还是得通过实际的项目才行了,好了废话不多说,上酸菜!! 注:红色标题为 ...

  9. C# 分部类与分部方法

    一.定义 分部方法是指能够使编码人员跨多个代码文件实现类型的语法.简而言之.它可以让我们在一个文件中构建方法原型,而在另一个文件中实现 使用分部方法和分部类需要使用关键词partial,且紧靠在cla ...

随机推荐

  1. QWaitCondition 的正确使用方法(通过 mutex 把有严格时序要求的代码保护起来,同时把 wakeAll() 也用同一个 mutex 保护起来)

    简单用法 QWaitCondition 用于多线程的同步,一个线程调用QWaitCondition::wait() 阻塞等待,直到另一个线程调用QWaitCondition::wake() 唤醒才继续 ...

  2. 【Codeforces Round #435 (Div. 2) B】Mahmoud and Ehab and the bipartiteness

    [链接]h在这里写链接 [题意] 让你在一棵树上,加入尽可能多的边. 使得这棵树依然是一张二分图. [题解] 让每个节点的度数,都变成二分图的对方集合中的点的个数就好. [错的次数] 0 [反思] 在 ...

  3. zynq mac地址修改

    工作中遇到多个zynq板子同时位于一个交换机网络中,由于默认mac地址相同,无法进行通信,因此需要对每个板子修改mac地址. 方案:使用uboot配置文件 步骤: 在uboot配置文件中添加及修改下面 ...

  4. css3-13 css3的3D动画如何实现

    css3-13 css3的3D动画如何实现 一.总结 一句话总结:这里是transform+setInterval实现.transform属性里面的rotate属性值变成rotateX或rotateY ...

  5. axios采坑之路

    POST请求设置Content-Type 由于后端采用的是form表单形式上送参数,需要设置Content-Type axios设置如下 const _axios = axios.create(con ...

  6. 格式化上下文formatting contexts

    原文 简书原文:https://www.jianshu.com/p/20c32c367b63 什么是格式化上下文(formatting contexts) Formatting context是W3C ...

  7. aspcms产品详情页调取相关产品

    产品详情页调用相关产品最常见的应用就是装饰公司网站,设计师页面要求调取设计师做过的案例.aspcms本身有这个功能,但不能完全符合要求,看代码 {aspcms:content sort={aspcms ...

  8. matplotlib学习之散点图与条形图

    # coding:utf-8 from matplotlib import pyplot as plt import numpy as np plt.style.use('ggplot') x = n ...

  9. ios开发清除SDWebImage图片缓存

    一:一般在实际的项目应用中都会用到第三方框架SDWebImage去下载缓存图片,但在ios开发应用中,常常涉及对SDWebImage缓存图片的清除.本文所列出代码即是对SDWebImage缓存图片的清 ...

  10. Centos6.5 VNC 配置

    VNC 配置 本教程配置说明 目的:实现Window下VNC登陆Linux服务器 本机是在root用户下操作完毕 两台主机已实现基本网络配置,且相互ping通 1. 检查图形界面 确保服务器端须要执行 ...