您的位置:首页 > 编程语言 > C#

C#2008语言特征4----局部方法

2009-03-21 12:39 218 查看
C# 1.1要求将类的全部代码放在一个文件中。而C# 2.0允许将类或结构的定义和实现分开放在多个文件中,这就是局部类的概念。通过使用关键字partial来标注一个类的各个部分,可以将各个不同的部分放在不同的文件中。例如,可以将下面的代码放到文件 MyClass1.cs 中:
public partial class MyClass
{
public void Method1()
{...}
}
在文件 MyClass2.cs 中,可以插入下面的代码:
public partial class MyClass
{
public void Method2()
{...}
public int Number;
}
那么完整的类的定义就是这两部分的组合。局部类是一个非常有用的功能。有时,需要修改机器生成的文件,例如 Web 服务客户端包装类。然而,当重新生成此包装类时,对该文件的修改将会被丢弃。通过使用局部类,可以将这些改变分开放在单独的文件中。Windows 窗体使用局部类来存储InitializeComponent 方法的可视化设计器输出以及成员控件。通过使用局部类型,两个或者更多的开发人员可以工作在同一个类型上。
C#2.0支持局部类的原理是:当编译器构建程序集时,它将来自多个文件的同一类型的各个部分组合起来,并用 Microsoft 中间语言 (Microsoft intermediate language, MSIL) 将这些部分编译成单一类型。生成的 MSIL 中不含有哪一部分来自哪个文件的记录。正如在 C# 1.1 中一样,MSIL不含有哪个文件用于定义哪个类型的记录。因为编译器所做的只是将各个部分累积,所以一个单独的文件可以包含多个部分,甚至是包含同一类型的多个部分。
在 C# 中,开发人员通常根据文件所包含的类来为文件命名,这样可以避免将多个类放在同一个文件中。在使用局部类型时,建议在文件名中指示此文件包含哪个类的哪些部分(例如 MyClassP1.cs、MyClassP2.cs),或者采用其他一致的方式从外形上指示源文件的内容。例如,Windows 窗体设计人员将用于该窗体的局部类的一部分存放在 Form1.cs 中,并将此文件命名为 Form1.Designer.cs。
局部类的一个不利之处是,当开始接触一个不熟悉的代码集时,您所维护类型的各个部分可能遍布在整个项目的文件中。在这种情况下,建议您使用 Visual Studio Class View,因为它可以将一个类的所有部分积累起来展示给您,并允许您通过单击它的成员来导航各个不同的部分。
在C#3.0中微软对这一特性进行了扩展,引入了局部方法的概念。局部方法允许在类的一部分声明一个方法或一个事件,而在类的另一部分实现这个方法或事件,在声明这个方法或事件之后,在类的另一部分可以实现也可以不实现。如果声明了局部方法而没有在类的另一部分实现。编译器编译时将删除局部方法的声明和所有对这个方法调用的代码。
下面介绍一下局部方法的规则:
1. 局部方法必须用partial关键字作为修饰符,返回类型必须是void。
2. 局部方法可以有ref参数,但不能有out参数。
3. 局部方法是private的,所以不能用virtual,public等修饰。
4. 局部方法不能是extern的。
5. 局部方法可以有static和unsafe修饰符。
6. 在声明中的参数的名称不必和局部方法的定义时的一样,但类型必须匹配。
7. 不能用delegate。
例子PartialMethod演示了一个局部方法。在文件Program.cs中放有代码
namespace PartialMethod
{
partial class Program
{
static void Main(string[] args)
{
MyPartialMethod(10);
Console.ReadKey();
}
/// <summary>
/// 局部方法MyPartialMethod的声明部分
/// </summary>
/// <param name="i">整型</param>
static partial void MyPartialMethod(int i);
}
}
文件Program2.cs中放有代码
namespace PartialMethod
{
partial class Program
{
/// <summary>
/// 局部方法MyPartialMethod的实现部分
/// </summary>
/// <param name="k"></param>
static partial void MyPartialMethod(int k)
{
Console.WriteLine("In partial method: {0}", k);
}
}
}
程序编译运行后,使用Reflector工具查看如图9-10所示:



图9-10
如果将Program2.cs删除掉,也就是只保留MyPartialMethod的声明部分,而没有方法的实现部分。程序也能编译通过,但是屏幕上面没有任何的输出,使用工具Reflector查看生成的代码。看到main函数的代码如图9-11所示:



图9-11
所以,让局部方法只有声明的时候,编译器将会删除局部方法的声明和所有对这个方法调用的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: