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

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

C#3 分部方法,简单标记一下相关推荐

  1. Head First JSP---随笔八(简单标记)

    定制标记开发 有时JSTL和标准动作还不够.构建自己的标记处理器有3种不同的方法.在这3种方法中,有两种(简单标记和标记文件)是在JSP 2.0新引入的. 建立定制标记库 10.1 描述执行各个事件方 ...

  2. .NET基础篇——分部类和分部方法

    在面向对象的"封装闭合性"开发原则中,一向提倡的是把独立的功能封装在一个类里面的!但从Visual Studio 2005开发,系统提供了一个分部类的开发方式一直受到争议,很多人认 ...

  3. C 语言的分部类和分部方法,c# partial 分部类和分部方法

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

  4. 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~四 分部方法从另一方面定义了类型的操作规范...

    一 DBContext的构造方法,方法的重载 二 DBContext实例中,表实体对象是怎么被加入的 三 分部类是否破坏了单一职责 四 分部方法从另一方面定义了类型的操作规范 五 LINQ实体类中对属 ...

  5. python如何安装panda数据库_在Pycharm中安装Pandas库方法(简单易懂)

    开发环境的搭建是一件入门比较头疼的事情,在上期的文稿基础上,增加一项Anaconda的安装介绍.Anaconda是Python的一个发行版本,安装好了Anaconda就相当于安装好了Python,并且 ...

  6. 分部方法 partial

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

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

     InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流. ...

  8. 黑盒测试概念简述,黑盒测试优缺点、黑盒用例设计方法简单介绍及黑盒测试方法使用总结

    黑色测试 黑盒测试概念: 黑盒的优缺点介绍: 黑盒测试用例设计方法简单介绍: 黑盒测试方法使用总结: 黑盒测试概念: 又称功能测试或数据驱动测试,是用来检测每个功能是否正常使用.黑盒测试主要意味着测试 ...

  9. 手机隐藏ip地址的方法简单设置

    手机隐藏ip地址的方法简单设置 转载于:https://blog.51cto.com/14019402/2313001

  10. 有限元方法入门:有限元方法简单的二维算例(三角形剖分)

    有限元方法简单的二维算例(三角形剖分) 文章目录 有限元方法简单的二维算例(三角形剖分) 算例描述 变分问题 有限元离散 问题转化 有限元三要素 参考单元与一般单元 一般单元上的形函数 一般单元上的积 ...

最新文章

  1. php报500怎么抛出来,PHP将日期爆炸为值并使用if语句抛出500个错误
  2. python读取字典元素笔记_python学习笔记:字典的使用示例详解
  3. mysql配置环境变量(win 10)_mysql配置环境变量(win 10)
  4. navicat 结合快捷键
  5. iOS核心动画CALayer和UIView
  6. 机器学习-数据科学库-day5
  7. mac 搭建mysql环境_Mac下MySQL环境搭建的步骤详解
  8. 交易系统开发(六)——HFT高频交易
  9. 智力答题源码php,基于PHP智力竞赛抢答计分系统PHP1025(毕业设计+论文)
  10. 净空法师:人到这个世间来干什么?做人的意义究竟在哪里?
  11. 梦幻西游手游海外服务器维护,梦幻西游手游维护 新神器任务轩辕丘之祸开启...
  12. 国标:计算机软件文档编制规范
  13. VMware 虚拟机安装 android-x86_64-9.0-r2 后 VirtWifi/无法访问互联网
  14. 通过bib文件引入参考文献
  15. 关于Tween的几个注意事项
  16. python给一个不多于 5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
  17. 解读vs2003、vs2005、vs2008开发Windows CE环境、默认SDK开发包及测试
  18. SLAM十四讲之第5讲--相机标定
  19. 判断一个多边形是否是凸多边形
  20. 乾颐堂2月HCIE、CCIE pass集合,洋洋洒洒21名同学

热门文章

  1. BAT中取得一个命令的执行结果
  2. LINUX上开发ffmpeg程序,查看链接的库
  3. 安装了opencv,怎么一直报错:找不到CAP_PROP_FRAME_COUNT
  4. python3: failed with error code 1 in /tmp/pip-build-qp5puacl/Pillow/
  5. VC++ 只运行一个程序实例
  6. python编写交互界面设计_第16 p,PYthon中的用户交互,Python GUI编程
  7. java 按钮垂直居中_WPF按钮中的文本内容未垂直居中
  8. linux缓冲设备,Linux设备驱动程序缓冲策略
  9. 25.212---复用和信道编码
  10. Everything常见问题及搜索技巧