天天看点

C#基础系列(3)之关键字partial

        之前一直以为它很简单,就没把它太当回事。今天却在项目代码当中遇到了这个关键字,才发现对它的认识仅仅停留在表面上,因此,为了深刻记住它,特此写一篇博客。

1. 什么是partial类型?

        C# 2.0 引入了局部类型的概念。局部类型允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。

2.什么时候会用到partial关键词?

局部类型使用情况如下:

(1) 类型特别大,不宜放在一个文件中实现。

(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。

(3) 需要多人合作编写一个类。

        局部类型是一个纯语言层的编译处理,不影响任何执行机制——事实上C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类。

        下面给出了一个Program局部类,具体看代码示例:

//这个Program的局部类,文件名为:Program.cs
using System;

namespace CSharpGrammarlyTest
{
    public partial class Program
    {
		static void Test3()
        {
            Console.WriteLine("这是Program类的Test3()方法");
        }
        
        static void Main(string[] args)
        {
            //调用成员对象的方法
            Program program = new Program();
            program.Test(); //这是Program_internal类的Test()方法
            Console.WriteLine("program.para: "+program.para);//0
			//调用静态属性和方法
            Console.WriteLine(Program.num); //2
            Console.WriteLine(num); //2
            Test2(); //这是Program_internal类的Test2()方法

            Console.ReadKey();
        }
    }
}
           
//这个也是Program的局部类,文件名为:Program_internal.cs
using System;

//必须在同一个命名空间下
namespace CSharpGrammarlyTest
{
	//这里的类名,必须与上一个保持一致,不然会认为是两个局部类
    public partial class Program
    {
        public int para = 0;

        public void Test()
        {
            Console.WriteLine("这是Program_internal类的Test()方法");
        }


        public static int num = 2;

        public static void Test2()
        {
            Test3(); //调用Program.cs的Test3()方法
            Console.WriteLine("这是Program_internal类的Test2()方法");
        }
    }
}
           

        上述代码不在运行时能够通过编译器的语法编译,原因在于:当我们使用partial修饰class时,编译器会默认把这些文件放在一起编译,而不是单个独立编译。

3. partial的限制

(1) partial关键词只适用于类、接口、结构,不支持委托和枚举。

(2) 同一个类型的各个部分必须都有修饰符 partial。

(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。

(4) 一个类型的各个部分必须被同时编译。

4. partial的注意点

(1) 关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。

(2) 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。

参考连接:

  1. https://www.cnblogs.com/superelement/p/7809086.html