c# partial 分部类和分部方法

一、partial

  它是一个关键字修饰符。可以将类或结构、接口或方法的定义拆分到两个或更多个源文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。修饰符不可用于委托或枚举声明中。

二、分部类

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

  • 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。
  • 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。 Visual Studio 在创建 Windows 窗体、Web 服务包装器代码等时都使用此方法。 无需修改 Visual Studio 创建的文件,就可创建使用这些类的代码。

  简单示例

public partial class Test
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public void ShowAge()
        {
            Console.WriteLine($" My age is {this.Age}");
        }
    }

    public partial class Test
    {
        public string Age { get; set; }
        public void ShowNewAge()
        {
            ChangeAge();
            Console.WriteLine($" My new age is {this.Age}");
        }

        private void ChangeAge()
        {
            this.Age = "20";
        }
    }

   class Program
    {
        static void Main(string[] args)
        {
            var test = new Test() { Id = 1, Name = "1", Age = "11" };
            test.ShowAge();
            test.ShowNewAge();
            var info = $" name:{test.Name},age:{test.Age}";
            Console.WriteLine(info);
        }
    }

  编译时会对分部类型定义的属性进行合并;将从所有分部类型定义中对以下内容进行合并:XML 注释、接口、泛型类型参数属性、class 特性、成员

 public class TestBase { }
    public interface ITest
    {
        void ShowAge();
    }

    [SerializableAttribute]
    public partial class Test: TestBase
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public void ShowAge()
        {
            Console.WriteLine($" My age is {this.Age}");
        }
    }

    [ObsoleteAttribute]
    public partial class Test: ITest
    {
        public string Age { get; set; }
        public void ShowNewAge()
        {
            ChangeAge();
            Console.WriteLine($" My new age is {this.Age}");
        }

        private void ChangeAge()
        {
            this.Age = "20";
        }
    }

它们等效于:

[SerializableAttribute]
    [ObsoleteAttribute]
    public class Test : TestBase,ITest
    {
        //...
    }

如果将任意部分声明为抽象的,则整个类型都被视为抽象的。 如果将任意部分声明为密封的,则整个类型都被视为密封的。

//抽象类示例
    public partial class PTest {}
    public abstract partial  class PTest {  }

   class Program
    {
        static void Main(string[] args)
        {
            //PTest PTest = new PTest();//提示:无法创建抽象类或接口"PTest"的实例
        }
    }

//密封类示例
    public partial class STest { }
    public sealed partial class STest { }

    //public class SubTest: STest { } 

三、分部方法

  分部类或结构可以包含分部方法。 类的一个部分包含方法的签名。 分部方法声明由两个部分组成:定义和实现。

  但是它的限制很多,只能在部分场景下使用。

  • 分部方法声明必须以上下文关键字 partial 开头,并且方法必须返回 void
  • 分部方法可以有 ref 参数,但不能有 out 参数。
  • 分部方法为隐式 private 方法,因此不能为 virtual 方法。
  • 分部方法不能为 extern 方法,因为主体的存在确定了方法是在定义还是在实现。
  • 分部方法可以有 static 和 unsafe 修饰符。
  • 分部方法可以是泛型的。 约束将放在定义分部方法声明上,但也可以选择重复放在实现声明上。 参数和类型参数名称在实现声明和定义声明中不必相同。
  • 你可以为已定义并实现的分部方法生成委托,但不能为已经定义但未实现的分部方法生成委托。

参考:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods

http://www.cnblogs.com/OpenCoder/archive/2009/10/27/1590328.html

时间: 2024-10-05 04:12:18

c# partial 分部类和分部方法的相关文章

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

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

分部类和分部方法

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

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

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

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

C# Partial:分部方法和分部类

using System; namespace Partial { class Program { static void Main(string[] args) { A a = new A(); } } partial class A { public A() { PrintHello(); PrintWorld(); Console.Read(); } partial void PrintHello() { Console.Write("Hello"); } } partial c

C# 分部类和方法 (partial)

可以将类.结构.接口和方法的定义拆分到多个源文件中.每个源文件包含类型或方法的部分定义,在编译时,这些部分会被组合起来. 1.Partial Classes 在以下几种情况需要拆分类定义: 对于大型项目,将一个类分部为多个独立文件可以让多个程序员同时对该类进行处理. 使用自定生成的源文件时,不用修改文件就可以将代码添加到类中.Visual Studio 在创建 Windows Forms,Web 服务包装代码时都用到了该方法.无需修改Visual Studio 创建的文件你就可以使用这些代码.

分部方法 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

来看看两种好玩的方法,扩展方法和分部方法

好久没过来扯淡了,话说这年头还有偶遇的事情吗?比如国庆回家的汽车上有个妹子要你qq,要你微信,想着法子跟你聊天,然后睡了一觉,醒来发现 肾不见了?小花絮小花絮,要是肾真没了,也吹不了牛,败不了火了,继续言归正传. 一:扩展方法 说到扩展方法,我想大家都已经再熟悉不过了,也许你的解决方案中有无数个这样的扩展方法,自从有了Linq之后,我们的集合就再也不单纯了. 从下面的Linq类中,所有的方法都扩展在IEnumerable<T>上,恰恰我们的集合都继承于IEnumerable接口下面. 然后我们

C#3 分部方法,简单标记一下

如果我问你,如果一个普通的类实现了一个接口方法,但是这个类的实例却访问不到这个接口的方法,这种情况你遇到过吗?有时候,你可能在使用分部方法时就会发现这么一个现象. C#3 中出现了 “分部方法” ,工作了好几年一直没用过,可能不咋实用,也有可能是工作中没有遇到这种场景,分部类倒是用了不少.最近看了一下,内容简单,标记一下. 我们 分部方法 和分部类有点类似的是 也是使用的关键字 partial ,不过不同的是 部分方法 不能有访问修饰符 (像public) 或者 virtual ,abstrac