C# 中的partial 关键字详解

2022-07-25 18:48:46
目录
引言分部类partial 分部限制分部接口和结构分部方法this 和 partial 的区别

引言

partial>partial 这个特性。

分部类

什么情况下需要拆分类定义呢?

    处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。当使用自动生成的源文件时,你可以添加代码而不需要重新创建源文件。>使用源生成器在类中生成附加功能时。

    例子

    将 Coords 类 分部在 2 个文件中定义。

    在这里插入图片描述

    CoordsOne.cs
    定义了 Coords 类的构造函数
    注意签名 partial class Coords

    namespace ConsoleApp1.PartialClass
    {
        public partial class Coords
        {
            private int x;
            private int y;
    
            public Coords(int x, int y)
            {
                this.x = x;
                this.y = y;
            }
        }
    }

    CoordsTwo.cs
    定义了 Coords 类的一个方法
    注意签名 partial class Coords

    namespace ConsoleApp1.PartialClass
    {
        public partial class Coords
        {
            public void PrintCoords()
            {
                Console.WriteLine("Coords: {0},{1}", x, y);
            }
        }
    }

    TestPartial.cs
    测试一下上面的分部类

    using ConsoleApp1.PartialClass;
    
    namespace ConsoleApp1
    {
        internal class TestPartial
        {
            static void Main(string[] args)
            {
                Coords coords = new Coords(10, 20);
                coords.PrintCoords();
            }
        }
    }

    结果:

    Coords: 10,20

    partial>

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

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

      例如,下面的类声明会生成错误:

      public partial class A { }
      //public class A { }  // Error, must also be marked partial
        partial 修饰符只能出现在紧靠关键字 classstructinterface 前面的位置。分部类型定义中允许使用嵌套的分部类型,如下面的示例中所示:
        partial class ClassWithNestedClass
        {
            partial class NestedClass { }
        }
        
        partial class ClassWithNestedClass
        {
            partial class NestedClass { }
        }
        

        要成为同一类型的各个部分的所有分部类型定义都必须在同一程序集和同一模块(.exe 或 .dll 文件)中进行定义。 分部定义不能跨越多个模块。经测试这些分部的文件必须在同一命名空间
        还是上面的例子,CoordsThree.cs 也定义成 partial 类,但是相比 CoordsOne.cs 和 CoordsTwo.cs 不是在同一个命名空间,会出错。

        在这里插入图片描述

        在这里插入图片描述

          类名和泛型类型参数在所有的分部类型定义中都必须匹配。 泛型类型可以是分部的。 每个分部声明都必须以相同的顺序使用相同的参数名。如果某关键字出现在一个分部类型定义中,则该关键字不能与在同一类型的其他分部定义中指定的关键字冲突:public,private,protected,internal,abstract,sealed 等

          将 CoordsOne.cs 中 public 改成 internal,产生访问属性冲突。

          在这里插入图片描述

          分部接口和结构

          同理,也可以开发分部结构和接口

          partial interface ITest
          {
              void Interface_Test();
          }
          
          partial interface ITest
          {
              void Interface_Test2();
          }
          
          partial struct S1
          {
              void Struct_Test() { }
          }
          
          partial struct S1
          {
              void Struct_Test2() { }
          }
          

          分部方法

          分部方法在分部类型的一部分中定义了签名,并在该类型的另一部分中定义了实现。>

            声明必须以上下文关键字 partial 开头。分部类型各部分中的签名必须匹配。构造函数、终结器、重载运算符、属性声明或事件声明中不允许使用 partial 关键字。

            例如:

            namespace PM
            {
                partial class A
                {
                    partial void OnSomethingHappened(string s);
                }
            
                // This part can be in a separate file.
                partial class A
                {
                    // Comment out this method and the program
                    // will still compile.
                    partial void OnSomethingHappened(String s)
                    {
                        Console.WriteLine("Something happened: {0}", s);
                    }
                }
            }
            

            在以下情况下,不需要使用分部方法即可实现:

              没有任何可访问性修饰符(包括默认的 专用)。返回 void。没有任何输出参数。没有以下任何修饰符:virtual、override、sealed、new 或 extern。

              this>

              C# - this 的用法 一文中有介绍 this 具有扩展类方法的功能,那么 thispartial 有区别是?

                概念的区别,this 是对原有功能进行扩展,partial 是将整体分成多个部分存放,便于维护。实现方式的区别

                patial 分部的签名要求一致,必须是 partial class/interface/struct Name,文件名不一样。
                this 扩展类名不一样,但必须是静态的类,静态的方法,方法第一个参数必须是 this ClassName

                  调用的区别

                  partial 分部的各个文件必须在同一 namespace 命名空间
                  this 扩展可以在不同命名空间,但是需要导入扩展的 namespace 命名空间后才能调用扩展的方法。

                  到此这篇关于C# 中的partial 关键字的文章就介绍到这了,更多相关C# partial 关键字内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!