C# 分部类和方法 (partial)

可以将类、结构、接口和方法的定义拆分到多个源文件中。每个源文件包含类型或方法的部分定义,在编译时,这些部分会被组合起来。

1.Partial Classes

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

  • 对于大型项目,将一个类分部为多个独立文件可以让多个程序员同时对该类进行处理。
  • 使用自定生成的源文件时,不用修改文件就可以将代码添加到类中。Visual Studio
    在创建 Windows Forms,Web
    服务包装代码时都用到了该方法。无需修改Visual Studio
    创建的文件你就可以使用这些代码。
  • 若要拆分类定义,使用关键字
    partial

如下所示:

    public partial class Employee {
        public void DoWork() {
        }
    }
    public partial class Employee {
        public void GoToLunch() {
        }
    }

partial
关键字说明在命名空间中可以定义类、接口、结构的其他部分。

  • 所有部分都要用partial
    关键字。
  • 编译时,这些部分必须全部可见,从而从来构建最终的类型
  • 所有部分必须有相同的访问性,

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

指定基类的所有部分必须一致,没有指定基类的部分,则默认继承基类。各个部分可以指定不同的接口,而最终类型将是吸纳所有分部声明的全部接口。在某一部分声明的任何类、结构或接口可供其他部分使用。

NOTEpartial
修饰符不能用于 delegate
enumeration声明。

下例演示嵌套类型的partial
定义,即使嵌套它们的类型不是partial也可以。

    public partial class Employee {
        public void DoWork() {
        }
    }
    public partial class Employee {
        public void GoToLunch() {
        }
    }

编译时,partial类型定义的所有
attributes 被合并,例如:

    [SerializableAttribute]
    partial class Moon { }
    [ObsoleteAttribute]
    partial class Moon { }

和下面的声明等效于:

    [SerializableAttribute]
    [ObsoleteAttribute]
    class Moon { }

下面所有项都会被合并:

  • XML comments
  • interfaces
  • generic-type parameter attributes
  • class attributes
  • members

例如,下面的声明:

    partial class Earth : Planet, IRotate { }
    partial class Earth : IRevolve { }

等效于:

<pre name="code" class="csharp">class Earth : Planet, IRotate, IRevolve { }
class Earth : Planet, IRotate, IRevolve { }

1.1
限制

处理分部类定义时,需要遵循以下几个原则:

  • 所有的partial-type
    定义都要带 partial
    修饰符。
  • partial
    修饰符必须紧靠在 class, struct
    或 interface
    前面。
  • 分部类型定义中允许嵌套的分部类型定义。如:

partial class ClassWithNestedClass {

partial class NestedClass { }

}

partial class ClassWithNestedClass {

partial class NestedClass { }

}

  • 所有的分部类型定义必须在同一程序模块(.exe
    或 .dll)中。
  • 类名和泛型类型参数在所有的分部类型定义中都必须一致。
  • 以下是可用于修饰 partial
    类型定义的关键字,同一类型不同部分的定义的关键字不能冲突:

    • public
    • private
    • protected
    • internal
    • abstract
    • sealed
    • base class
    • new modifier
    • generic constraints

1.2
1

下面的示例演示在分部类CoOrds一部分中声明字段和构造函数,另一部分声明成员
PrintCoOrds:

public partial class CoOrds {

private int x;

private int y;

public CoOrds(int x, int y) {

this.x = x;

this.y = y;

}

}

public partial class CoOrds {

public void PrintCoOrds() {

Console.WriteLine("CoOrds: {0},{1}", x, y);

}

}

class TestCoOrds {

static void Main() {

CoOrds myCoOrds = new CoOrds(10, 15);

myCoOrds.PrintCoOrds();

// Keep the console window open in debug mode.

Console.WriteLine("Press any key to exit.");

Console.ReadKey();

}

}

// Output: CoOrds: 10,15

1.3
2

演示分部结构和接口:

partial interface ITest {

void Interface_Test();

}

partial interface ITest {

void Interface_Test2();

}

partial struct S1 {

void Struct_Test() { }

}

partial struct S1 {

void Struct_Test2() { }

}

2.分部方法(Partial
Methods)

分部类或结构可以包含分部方法。分部方法包含两部分:声明和定义。声明和定义可以在同一分部,也可以在不同部分。例如:

// 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
    修饰符。
  • 可以为泛型。泛型参数放在声明中,也可以在实现中重复声明。类型参数名在声明和实现中不必一样。
  • 可以为定义的分部方法定义委托,未定义的分部方法不能定义委托。
时间: 2024-10-24 01:54:49

C# 分部类和方法 (partial)的相关文章

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

分部类和分部方法

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

c# partial 分部类和分部方法

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

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

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

C#分部类和分部方法的使用

将同一个类编写在多个文件中,类的各个文件名不同,类名相同,类名前加partial关键字,这种类型叫分部类. 在分部类中可以建立分部方法,方法名前加关键字partial,分部方法只能将方法分成两部分,即声明部分和实现部分分别位于不同的分部类里.分部方法可以使静态方法,但必须是隐式的私有方法,并且无返回值的方法,因为分部方法时私有方法,所以无法使用virtual修饰符,即不能成为虚方法:分部方法可以有ref参数,但不能有out参数:不允许将委托转换为分部方法. 下例中首先建立项目PartialTyp

C# 静态static 嵌套类 分部类

/*static的相关内容:静态字段,静态属性,静态方法,,静态构造,静态类,readonly,const,嵌套类,分部类 * static可以理解为全局的,共享同一块内存 * 可以通过default(类型名)得到每个类型的默认值 * 静态字段不从属于字段而是从属与类,而实例字段都是从属于每个字段,针对于每个字段都有不同的值 * 类和对象都能关联数据: * this是用于实例的访问方法,所以你能用this.静态成员进行访问 * 要想在静态方法中获得实例成员的访问,就必须先获得对字段或方法所从属于

分部方法 partial

当有如下这样类似的情况出现的时候,可以有更好的优化方式来处理,那就是分部方法 1 class PartOld 2 { 3 string name; 4 5 public virtual void OnChangeName(string str) 6 { 7 } 8 9 public string Name 10 { 11 set 12 { 13 //如果该方法没有实现的话,生成的IL 代码也会有调用这样的一个虚方法 callvirt, 造成性能上不必要的损失 14 OnChangeName(va

2017-9-23C#笔记(类的索引,事件,运算符,this访问器,派生,分部类,抽象类,封闭类,静态类,类与结构的不同)

1.类的索引 索引是一组get和set锋访问器,支持按照饮用数组元素的方法来引用对象.索引通常便是多个数据成员,并且它总是以雷类的事例成员的方式存在.声明索引的方法: 返回类型     this  [参数列表] { Get {    } set {        } } 例如:using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplicat

18._3分部类概述及其使用

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _18._3分部类概述及其使用 { partial class atithmetic //阶乘 { public int factorial(int num) { int factorial = 1; for(int i =num;i>0;i--)