zoukankan      html  css  js  c++  java
  • C# partial 关键字分析

    简单的来说

    partial是局部类型的意思
    就是说有这个关键字的类、结构或接口可以写成几个部分
    比如 public partial class Program
      {
        static void Main(string[] args)
        {
        }
      }
    
      partial class Program
      { 
        public void Test()
        { 
        }
      }
    编译后它相当于
    public class Program
      {
        static void Main(string[] args)
        {
        }
    
       public void Test()
        { 
        }
    
      }
    

     下面作详细的分析:

    partial关键字允许把类、结构或接口放在多个文件中。一般情况下,一个类存储在单个文件中。但有时,多个开发人员需要访问同一个类,或者某种类型的代码生成器生成了一个类的某部分,所以把类放在多个文件中是有益的。

    partial关键字的用法是:把partial关键字放在classstructinterface关键字前面。

    我在下面用几个例子作说明:

    含有三个类文件:PartialClassPart1.csPartialClassPart2.csProgram.cs,两个部分类分别置于前面两个类文件中,各有一个方法。

    【PartialClassPart1.cs】
    using System;
    namespace PartialClass
    {
        partial class partialClass
        {
            public void Method1()
            {
                Console.WriteLine("PartialClassPart1-partialClass-Method1");
            }
        }
    }


    【PartialClassPart2.cs】 using System; namespace PartialClass {     partial class partialClass     {         public void Method2()         {             Console.WriteLine("PartialClassPart2-partialClass-Method2");         }     } }


    代码执行类【Program.cs】 using System; namespace PartialClass {     class Program     {         static void Main(string[] args)         {             partialClass Pc = new partialClass();             Pc.Method1();             Pc.Method2();             Console.ReadKey();         }     } }

     结果:

    PartialClassPart1-partialClass-Method1

    PartialClassPart1-partialClass-Method2

    当然:这两个method的名字不能一样!

    //BigClassPart1.cs
    [CustomAttribute]
    partial class TheBigClass:TheBigBaseClass,IBigClass
    {
               public void Method1(){};
    }
    //BigClassPart2.cs
    [AnotherAttribute]
    partial class TheBigClass:IOtherBigClass
    {
               public void Method2(){};
    }
    
    编译后的结果:
    [CustomAttribute]
    [AnotherAttribute]
    partial class TheBigClass:TheBigBaseClass,IBigClass,IOtherBigClass
    {
               public void Method1(){};
               public void Method2(){};
    }
    

    注意点,总结:

    如果声明类使用了下面的关键字,这些关键字将应用于同一个类的所有部分:

    publicprivateprotectedinternalabstractsealednew ,一般约束。

    在嵌套的类型中,只要partial关键字位于class关键字的前面,就可以嵌套不分类。在把部分类编译到类型中时,会合并属性,XML注释,接口,泛型类型的参数属性和成员。 

     

    partial 关键字的作用是将你的 class 分为多个部分,编译器会将多个部分拼到一起去。 

    public partial class SampleClass 
    { 
      public void MethodA() 
      { 
      } 
    } 
     
    public partial class SampleClass 
    { 
      public void MethodB() 
      { 
      } 
    } 
    
    和 
    
    public class SampleClass 
    { 
      public void MethodA() 
      { 
      } 
      public void MethodB() 
      { 
      } 
    } 
    
    是等价的。 
    

    我猜想这个东西出现的初衷是为了解决掉:窗体设计器生成的代码这个令人讨厌的 region。 对我们来说,在团队开发当中这个东西或许也会有点用处。 我观察了一下生成的 IL 代码,使用 partial 生成的代码并没有什么特殊的标记,这说明 partial 纯粹是语言的特性,CLR 完全不知道这么个玩意的存在,这也就意味着不要指望将 partial class 编译为 assembly 或者 module 什么的再与其他的人写的 partial class 去进行拼接:它只能在编译的时候起作用。 为了考验一下编译器,我试着让某一个 partial class 不显式指定父类,发现代码仍然能够正确的通过编译,编译器会按照某一个显式指定了父类的 partial 进行编译,只有在多个 partial 指定了不同父类时才会报错。同样,如果多个 partial 指定了自相矛盾的修饰符的话,编译时也会报错的。 有意思的是,我们还可以写以下这样的代码: 

    public partial class Sample 
    ...{ 
    public partial class SampleSon 
    ...{ 
    public partial class SampleGrandson 
    ...{ 
    } 
    } 
    }
    
    public partial class Sample 
    ...{ 
    public partial class SampleSon 
    ...{ 
    public partial class SampleGrandson 
    ...{ 
    } 
    } 
    }
    
  • 相关阅读:
    AngularJS 用 $http.jsonp 跨域SyntaxError问题
    jQuery调用WCF需要注意的一些问题
    WCF 添加 RESTful 支持,适用于 IIS、Winform、cmd 宿主
    搭建个人博客-hexo+github
    Git错误提示之:fatal: Not a git repository (or any of the parent directories): .git
    C# WCF 完整实例,winform 窗体作为 宿主
    【WCF】HTTP 无法注册 URL 进程,不具有此命名空间的访问权限
    Jsoncpp Compiler、Programming
    CVE-2015-1328 Ubuntu 12.04, 14.04, 14.10, 15.04 overlayfs Local Root
    Linux UserSpace Back-Door、SSH/PAM Backdoor/Rootkit、SSH Session Hijacking技术研究
  • 原文地址:https://www.cnblogs.com/little-white/p/3466938.html
Copyright © 2011-2022 走看看