当前位置: 首页 > news >正文

C#分部类型解析

   等待着元宵节的到来,过完元宵,这个年也算是过完了,也得开始出去挣钱了,过年回家感觉每个人都觉得很牛,只有自己太渣,为了避免年底再出现这样尴尬的局面,还是需要努力干活。争取当上CEO,赢取白富美,走上人生巅峰。(生活需要幻想,也需要面对现实,努力获取一个向上的心态,比起拥有财富要更加的难得。)

  

     对于现在还在聊QQ和看博客的同志们,我只想借用上图问一句“你们不上班么?...哈哈哈...”。好了,不扯淡了,开始我们今天的主题。

     C#的类型中,我们知道最多的就是静态类,对于静态类的一些特性在这里就不做介绍了,因为对于一个.NET开发者来说,静态类的一些特性应该是有一定的掌握,并且在项目中应用的也是非常多。现在需要介绍的是另一种类型,那就是“分部类型”,对于“分部类型”的了解,很多人估计也就是知道而已,接下来就让我们一起来学习一个“分部类型”这一C#的语言特点。

一.C#分部类型和分部方法解析:

   1.分部类型概述:

     学习“分部类型”,我们还是先来了解一下什么叫做“分部类型”。分部类型是指可以在多个源文件中为一个类型编写代码。对于分部类型的使用场景,使用最多的地方是部分代码是自动生成,而其他部分的代码为手写的类型。“分部类型”是由C#2.0时引入的。在继承链上存在一个不必要的链接,会引发某些问题或降低封装型。

     我们现在对于分部类型的定义有一个大致的了解,以及对分部类型的应用场景也有一个初步的了解,接下来我们来看一下如何创建分部类型和分部类型的使用方法。

   2.分部类型的创建和使用方法:

       如果需要创建分部类型,我们只需要在涉及的每个文件的类型的声明部分添加一个上下文关键字partial。对于分部类型,编译器在编译之前就把所有的文件合并在一起了。在一个文件中代码可以调用另外一个文件中的代码。有如下代码:

   SegmentType1.cs:

 partial class SegmentType
    {
        private void Add()
        {
            Update();
        }

        private void Delete()
        {
        }
    }

 SegmentType2.cs

  partial class SegmentType
    {
        private void Update()
        {
            Delete();
        }
    }

    以上是对分部类型做了一个简单的申明和应用,这两个.CS文件在编译器编译之前就已经合并在一起了。对于分部类型不能在一个文件中编写成员的一半代码,而把另外一半代码放到另外一个文件中,必须保证每个独立的成员必须完整地位于它所处的文件中。如下代码:

  SegmentType1.cs:

    partial class SegmentType
    {
        private void Add(string fileName)
        {
            FileStream fs = null;
            try
            {
                fs = File.Create(fileName);
            }           
        }
    }

SegmentType2.cs

 partial class SegmentType
    {
        private void Update()
        {
            Add();
            catch (ArgumentException arex)
            {
                throw arex;
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                    fs.Dispose();
                }
            }
        }
    }

   上面演示的做法是无法通过编译的。

   对于类型的声明还有一些限制,那就是声明必须要相互兼容,任何文件都能指定要实现的接口和基类型,以及类型参数的约束。如果多个文件都设定了基类型,那么它们必须是相同的,并且如果多个文件都设定了类型参数约束,那么约束必须是一致的。有如下代码实例:

  SegmentType1.cs:

    //接口约束:IEquatable<string>;
    //where TFirst:class :和类型参数约束
    partial class SegmentType<TFirst,TSecond>:IEquatable<string> where TFirst:class 
    {
        //实现IEquatable<string>接口方法
        public bool Equals(string other)
        {
            return false;
        }
    }

SegmentType2.cs

    //指定基类:EventArgs
    //指定接口:IDisposable
    partial class SegmentType<TFirst, TSecond> :EventArgs,IDisposable
    {
        //实现方法
        public void Dispose()
        {
        }
    }

  以上的接口和基类约束中,也可以使用如下方法:

 SegmentType1.cs:

    //接口约束:IEquatable<string>;
    //where TFirst:class :和类型参数约束
    partial class SegmentType<TFirst,TSecond>:IEquatable<string> where TFirst:class 
    {
        //实现方法
        public void Dispose()
        {
        }
    }

SegmentType2.cs

    //指定基类:EventArgs
    //指定接口:IDisposable
    partial class SegmentType<TFirst, TSecond> :EventArgs,IDisposable
    {
        //实现IEquatable<string>接口方法
        public bool Equals(string other)
        {
            return false;
        }
    }

   对于接口和基类型约束可以进行交换,基于这种特性,可以将指定的接口与实现分离,将为不同类型生成相同的签名的方法封装到一个接口中。无法在声明类型时指定其实现了该接口。

   以上是主要讲解了分部类型的创建和使用方式,接下来我们再来了解一下分部方法的相关知识。

 3.分部方法解析:

   对于分部方法的相关概念,在前面介绍分部类型时已经做了介绍,分部方法的创建和使用与分部类型类似。分部方法有一个特点:任何对未实现的分部方法的调用,都会被编译器移除。

  分部方法的声明与抽象方法的申明类似,只需要使用partial修饰符提供签名而无须任何实现。实现也需要partial修饰符进行修饰。有如下代码:

 SegmentType1.cs:

 partial class SegmentType
    {
        public SegmentType()
        {
            SegmentTypeStart();
            Console.WriteLine("分部方法解析...");
            SegmentTypeEnd();
        }

        partial void SegmentTypeStart();

        partial void SegmentTypeEnd();
    }

SegmentType2.cs

  partial class SegmentType
    {
        partial void SegmentTypeStart()
        {
            Console.WriteLine("分部方法开始...");
        }
    }

   在分部方法中,由于方法可能不存在,所以分部方法返回类型必须声明为void,且不能获取out参数。分部方法必须是私有的,但是是静态的或是泛型。

二.C#分部类型和分部方法的特点:

   上面介绍了分部类型和分部方法的定义、创建和使用方式,在这里主要介绍一下分部方法和分部类型的特点。分部类型主要连接设计器和其他代码生成器。利用分部类型模型,代码生成器可以拥有自由的操作文件,或者只要它愿意可以每次都重写整个文件。

   某些代码生成器还可以选择不生成任何C#文件,而是等到构建进行的时候再生成。代码生成器的应用比较的广泛,比如Web服务器代理、ORM工具生成配置文件等等。对于在ORM工具的应用有如下图:

   

   分部类型在其他方面也有比较多的使用,分部类型可以辅助我们进行重构。(重构的第一步就是将比较大的类型分成较小的类,很多的关联的内容首先就可以分割为在两个或多个文件上存放的分部类型。)

   分部类型也可以帮助我们进单元测试。

   分部方法能在手动创建的文件中指定某种行为,并在自动生成的文件中使用该行为。

三.C#分部类型实例:

   分部类型和分部方法是一个语言特性,在这里给出一个使用了分部类型的项目。https://github.com/fiidau/Phasing-Utility

四.总结:

     对于分部类型和分部方法的介绍还有很多,在本文中只是做了一个简单的介绍,分布类型的使用也是比较的广泛,可以极大的提升我们的代码质量。希望本文对大家有所帮助。

相关文章:

  • 博为峰Java技术文章 ——JavaSE Swing JTabbedPane选项卡面板II
  • JS 设置盒子div 跳转
  • 数组操作函数总结
  • 在Unity(C#)下实现Lazy Theta*寻路
  • 双显卡笔记本安装CUDA+theano、tensorflow环境
  • Zabbix3.x 服务安装、配置及常见问题处理
  • Material Design学习之 Camera
  • Perl 获得当前路径
  • 【254】◀▶IEW-Unit19
  • windbg调试命令
  • Makefile经典教程(掌握这些足够)
  • inotify-tools命令使用讲解
  • mysql5.7.17主从同步配置
  • 『设计模式』之小试牛刀
  • callback和spring的MD5加密
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • LeetCode29.两数相除 JavaScript
  • leetcode388. Longest Absolute File Path
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 理解在java “”i=i++;”所发生的事情
  • 聊聊directory traversal attack
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 思否第一天
  • 王永庆:技术创新改变教育未来
  • 详解NodeJs流之一
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (C++20) consteval立即函数
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (万字长文)Spring的核心知识尽揽其中
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)VC++中ondraw在什么时候调用的
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .Net(C#)常用转换byte转uint32、byte转float等
  • [ 数据结构 - C++] AVL树原理及实现
  • [.net] 如何在mail的加入正文显示图片
  • [20150904]exp slow.txt
  • [20170705]diff比较执行结果的内容.txt
  • [BJDCTF2020]The mystery of ip1
  • [Bugku]密码???[writeup]
  • [C#]DataTable常用操作总结【转】
  • [C++]高精度 bign (重载运算符版本)
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [ffmpeg] av_opt_set 解析
  • [HAOI2016]食物链