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分部类一种自然的延续。

原文地址:https://www.cnblogs.com/wwkk/p/10325463.html

时间: 2024-10-17 00:05:16

C#3 分部方法,简单标记一下的相关文章

c# partial 分部类和分部方法

一.partial 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.修饰符不可用于委托或枚举声明中. 二.分部类 在以下几种情况下需要拆分类定义: 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理. 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中. Visual Studio 在创建 Windows 窗体.Web 服务包装器代码等时都使用此方法.

CFileDialog的使用方法简单介绍

CFileDialog文件选择对话框的使用:首先构造一个对象并提供对应的參数,构造函数原型例如以下: CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParen

Android SDK下载速度慢的解决方法(简单使用代理)

相信做android开发的同学们,一定会遇到的问题就是google那边经常崩,但是学习的开始,我们又必须要用Android SDK,(几个G的大小),一般我们装完ADT之后(如果你用的是Eclipse,android studio的就不需要了.),这时候我们需要打开SDK Manager来下载Android SDK的一些工具,还有android不同版本的内容.但是你会发现速度慢得惊人.原因就是Google. 本来不想因为这个东西写一篇博文的,但是因为怕刚开始学android的人会在上面浪费很多时

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是字节流通向字符流的桥梁.假设不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK. 构造方法: InputStreamReader isr = new InputStreamReader(InputStream in);//构造一个默认编码集的InputStreamReader类 Inp

md5 对字符串进行加密的方法 简单好用

1 public static String makeMD5(String password) { 2 String result = null; 3 4 MessageDigest messageDigest; 5 try { 6 messageDigest = MessageDigest.getInstance("MD5"); 7 messageDigest.update(password.getBytes()); 8 result = new BigInteger(1, mess

C#练习笔记3:分部类分部方法,索引结合异常的使用

分部类,分部方法,索引的运用虽说不常见,但是有时还是会用到的,还有一些异常的处理, using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { //分部类测试 Te

来看看两种好玩的方法,扩展方法和分部方法

好久没过来扯淡了,话说这年头还有偶遇的事情吗?比如国庆回家的汽车上有个妹子要你qq,要你微信,想着法子跟你聊天,然后睡了一觉,醒来发现 肾不见了?小花絮小花絮,要是肾真没了,也吹不了牛,败不了火了,继续言归正传. 一:扩展方法 说到扩展方法,我想大家都已经再熟悉不过了,也许你的解决方案中有无数个这样的扩展方法,自从有了Linq之后,我们的集合就再也不单纯了. 从下面的Linq类中,所有的方法都扩展在IEnumerable<T>上,恰恰我们的集合都继承于IEnumerable接口下面. 然后我们

C#中分部类和分部方法的应用

本篇文章介绍了,C#中分部类和分部方法的应用.需要的朋友参考下 分部类(Partial Class)在C#2.0引入,分部方法(Partial Method)在C#3.0引入,这两个语法特性都具有相同的特性:将类(或)方法的代码分散在多个地方. 1.分部类的特性和应用 1.1分部类的定义 在定义一个类时,加上partial关键字,此类即成为分部类. 分部类允许将一个类的代码分散于一个以上的源代码文件中. Person.cs代码如下 1 namespace PartialClassDemo1 2

分部类和分部方法

分部类通过关键字partial进行声明,分部类可以将类.结构或接口的定义拆分到两个或多个源文件中.每个源文件包含类定义的一部分,编译应用程序时将把所有部分组合起来.在以下几种情况下需要拆分类定义: 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理. 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中.Visual Studio 在创建 Windows 窗体.Web 服务包装代码等时都使用此方法.您无需编辑 Visual Studio 所创建的文件,便可创建使