可以将 类或 结构、 接口或方法的定义拆分到两个或多个源文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。

分部类

在以下几种情况下需要拆分类定义:

  • 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。
  • 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。Visual Studio 在创建 Windows 窗体、Web 服务包装代码等时都使用此方法。无需修改 Visual Studio 创建的文件,就可创建使用这些类的代码。

若要拆分类定义,请使用 partial 关键字修饰符,如下所示:

•    public partial class Title
•    {
•        public void TitleRead()
•        {
•        }
•    }
•    
•    public partial class Title
•    {
•        public void TitleWrite()
•        {
•        }
•    }

如果将任意部分声明为抽象的,则整个类型都被视为抽象的。如果将任意部分声明为密封的,则整个类型都被视为密封的。如果任意部分声明基类型,则整个类型都将继承该类。

指定基类的所有部分必须一致,但忽略基类的部分仍继承该基类型。各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。最终类型是所有部分在编译时的组合。

限制

处理分部类定义时需遵循下面的几个规则:

要作为同一类型的各个部分的所有分部类型定义都必须使用 partial 进行修饰

·         public partial class A { }

·         //public class tcA { }  // Error, must also be marked partial

·         partial 修饰符只能出现在紧靠关键字 classstructinterface 前面的位置。

分部类型定义中允许使用嵌套的分部类型,如下面的示例中所示:

partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }

通过以上的文章分析,我们可以通过LINQ实例查看一下实际使用效果,

1.       新建立一个vs项目

2.       新建立一个dbml文件

3.       从服务器资源管理器重拉一个表到dbml文件中

Vs2010 自动为我们生成了DataClasses1DataContext.designer.cs类

internal partial class DataClasses1DataContext : System.Data.Linq.DataContext
{
...
}

这里留意internal partial class DataClasses1DataContext 使用了限制分部类的定义partial

出现的位置在class之前.

我们使用自动生成的源文件,我们不想修改vs创建的文件,于是我们可以建立一个分部类.新建立一个类, 进行扩展.

partial class DataClasses1DataContext

{

}

或者是dbml 里面的定义类

partial class Files
    {
        String  _myfiel;
        public  string  myfilet
        {
            get { return  _myfile; }
            set { _myfile = value; }
        }
    }

分部方法

分部类或结构可以包含分部方法。类的一个部分包含方法的签名。可以在同一部分或另一个部分中定义可选实现。如果未提供该实现,则会在编译时移除方法以及对方法的所有调用。

分部方法使类的某个部分的实施者能够定义方法(类似于事件)。类的另一部分的实施者可以决定是否实现该方法。如果未实现该方法,编译器将移除方法签名以及对该方法的所有调用。因此,分部类中的任何代码都可以随意地使用分部方法,即使未提供实现也是如此。如果调用了未实现的方法,将不会导致编译时错误或运行时错误。

在自定义生成的代码时,分部方法特别有用。这些方法允许保留方法名称和签名,因此生成的代码可以调用方法,而开发人员可以决定是否实现方法。与分部类非常类似,分部方法使代码生成器创建的代码和开发人员创建的代码能够协同工作,而不会产生运行时开销。

分部方法声明由两个部分组成:定义和实现。它们可以位于分部类的不同部分中,也可以位于同一部分中。如果不存在实现声明,则编译器将优化定义声明和对方法的所有调用

// Definition in file1.cs
partial void onNameChanged();

// Implementation in file2.cs
partial void onNameChanged()
{
  // method body
}

·         分部方法声明必须以上下文关键字 partial 开头,并且方法必须返回 void。

·         分部方法可以有 ref 参数,但不能有 out 参数。

·         分部方法为隐式 private 方法,因此不能为 virtual 方法。

·         分部方法不能为 extern 方法,因为主体的存在确定了方法是在定义还是在实现。

·         分部方法可以有 static 和 unsafe 修饰符。

·         分部方法可以为泛型的。约束将放在定义分部方法声明上,但也可以选择重复放在实现声明上。参数和类型参数名称在实现声明和定义声明中不必相同。

您可以为已定义并实现的分部方法生成 委托,但不能为已经定义但未实现的分部方法生成委托。

在LINQ使用中DataClasses1DataContext.dbml 文件自动为我们生成了DataClasses1DataContext.designer.cs类同时,还生成了一些可扩展性方法定义

例如

partial void OnLoaded();

partial void OnValidate(System.Data.Linq.ChangeAction action);

…..

方便开发人员可以决定使用该方法.

转载于:https://www.cnblogs.com/meetweb/archive/2012/01/13/2322028.html

分部类和方法的学习以及在LINQ中的应用(原创)相关推荐

  1. python中find函数的使用方法_Python学习日记5|BeautifulSoup中find和find_all的用法

    今天是4.20号. 前天晚上看到蒋方舟的一句话: 不要左顾右盼.慢慢积累,慢慢写吧.毕竟除了这样单调的努力,我什么也做不了. 而现在的自己就是个十足的壁花少年. 在进入正题前先说一下每次完成代码后,可 ...

  2. C#的分部类(partial)和方法

    一.实现的效果 C#的分部关键字(partial)能够拆分一个类.一个结构.一个接口或一个方法为两个或更多个的文件,分部的每个文件都可以包含自己的类型和方法,程序编译时会将同类的分部内容合并为一个. ...

  3. 《强化学习周刊》第35期:强化学习在智能交通中的最新应用

    No.35 智源社区 强化学习组 强 化 学  习 研究 观点 资源 活动 关于周刊 强化学习作为人工智能领域研究热点之一,其研究进展与成果也引发了众多关注.为帮助研究与工程人员了解该领域的相关进展和 ...

  4. C# 中的分部类和分部方法

    一.分部类 有创建过Web窗体应用的同学,应该都有 注意到在窗体类的前面默认加上了Partial 的修饰符, 这个就是我们今天要讨论的问题 ,通俗的来讲:Partial 的目的就是把一个类 分成两个或 ...

  5. C#拾遗系列(9):继承、接口、扩展方法、分部类、类操作、Ref and Out、可空类型...

    本文内容: 继承 Equal示例 结构和类 属性 Ref and Out 类操作 扩展方法 接口 可空类型 分部类 1. 继承 using System; using System.Collectio ...

  6. 分部类(partial class)和分部方法

    分部类 类的声明可以分割成几个分部类的声明. ●每个分部类的声明都含有一些类成员的声明. ●类的分部类声明可以在同一文件中也可以在不同文件中. ●每个局部声明必须被标为partial class,而不 ...

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

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

  8. java 分部类_C#综合揭秘——分部类和分部方法

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

  9. C#学习记录——分部类

    『丢掉幻想,准备斗争.』-- 毛泽东选集 分部类 分部类概述 分部类是C#4.0中一个比较特殊概念,分部类的出现使程序的结构更加合理,代码的组织更加紧密.可以将类.结构或接口的定义拆分到两个或多个源文 ...

最新文章

  1. 智能音箱自己把自己黑了:随机购物拨号,自主开灯关门,平均成功率达88%
  2. 【Ping】unix - ping命令的退出状态
  3. python里import time_python模块---time和timedate
  4. arduino的IDE开发stm32的板子
  5. 限流中间件IpRateLimitMiddleware的使用
  6. mysql的contains_mysql中json_contains、json_extract等json查询方法的使用
  7. centos6.5装mysql好难_centos 6.5装mysql5.7
  8. 超像素分割算法matlab_像素不够,算法来凑。这个图像超分辨率项目帮你「拍」出高清照片...
  9. 蓝懿IOS实战音乐播放器
  10. 安全防御——防病毒网关
  11. java app远程调取摄像头_Java调用计算机摄像头照相(Rest API控制,方便远程拍照)...
  12. python PIL生成gif帧率问题
  13. Node - 从0基础到实战企业官网
  14. SuperMap iDesktopX 影像/栅格数据不用导入导出即可分析处理啦!
  15. Win10新添实用功能,你发现了吗?
  16. 卡通可爱的门户网站登录表单页面
  17. java数据类型_Java数据类型
  18. 【项目】数仓项目(二)
  19. java 最大子序列和
  20. html5中移动旋转缩放,HTML5 Canvas进阶(一):渐变,透明,移动,旋转,缩放

热门文章

  1. ArcGIS——Window Server2016中的安装10.2问题
  2. Arcgis Javascript那些事儿(十二)——geometry service几何服务
  3. Go语言中的复合类型及面向对象思想
  4. 获取android手机基本信息
  5. rust能捏人不_不跟风出游的五一假期,武汉人到底能去哪
  6. pycharm python3.7环境_Python3+Pycharm+PyQt5环境搭建步骤图文详解
  7. 定时器的实现原理 不消耗cpu_空闲CPU在做什么?
  8. 【java学习之路】(java SE篇)009.IO
  9. Bug--WARN Please initialize the log4j system properly.
  10. MySQL的sql_mode解析设置