iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C# 中的partial 关键字详解
  • 302
分享到

C# 中的partial 关键字详解

2024-04-02 19:04:59 302人浏览 八月长安
摘要

目录引言分部类partial 分部限制分部接口和结构分部方法this 和 partial 的区别引言 partial 关键字用于拆分一个类、一个结构、一个接口或一个方法的定义到两个或

引言

partial 关键字用于拆分一个类、一个结构、一个接口或一个方法的定义到两个或更多的文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。在设计 Framework 时,可以充分利用 partial 这个特性。

分部类

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

  • 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。
  • 当使用自动生成的源文件时,你可以添加代码而不需要重新创建源文件。 Visual Studio 在创建 windows 窗体、WEB 服务包装器代码等时会使用这种方法。 你可以创建使用这些类的代码,这样就不需要修改由 Visual Studio 生成的文件。
  • 使用源生成器在类中生成附加功能时。

例子

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.csCoordsTwo.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 和 partial 的区别

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

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

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

  • 调用的区别

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

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

--结束END--

本文标题: C# 中的partial 关键字详解

本文链接: https://www.lsjlt.com/news/165192.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C# 中的partial 关键字详解
    目录引言分部类partial 分部限制分部接口和结构分部方法this 和 partial 的区别引言 partial 关键字用于拆分一个类、一个结构、一个接口或一个方法的定义到两个或...
    99+
    2022-11-13
  • C/C++中的static关键字详解
    目录C/C++ 中的 static1. 静态局部变量2. 静态全局变量3. static 修饰函数C++的 static 成员静态成员变量 静态成员函数总结:static是...
    99+
    2022-11-13
  • C#中的yield关键字详解
    在"C#中,什么时候用yield return"中,我们了解到:使用yield return返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元...
    99+
    2022-11-13
  • C++中的explicit关键字详解
    目录前言1. 抑制构造函数定义的隐式转换2. 为转换显式地使用构造函数3. 类型转换运算符可能产生意外结果4. 显示的类型转换运算符5. explicit练习5.1 当不使用expl...
    99+
    2022-11-13
  • C#中关键字get、set、value、partial、where和yield怎么用
    这篇文章主要介绍C#中关键字get、set、value、partial、where和yield怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C#关键字——get、set、valueget 在属性或索引...
    99+
    2023-06-17
  • 详解C语言中的Static关键字
    一、static关键字的基本含义 首先,static关键字的意思是静态的,用于修饰局部变量,全局变量和函数,修改其数据储存类型 1.局部变量:在任意一个函数内部定义的变量(不加sta...
    99+
    2022-11-13
  • 详解C++中inline关键字的作用
    目录inline关键字:目的:原理:注意事项:总结 inline关键字: 目的: 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。 原理: 调用函数的...
    99+
    2022-11-12
  • c++中的volatile和variant关键字详解
    目录一、两个长得有点像的变量二、二者的功能三、应用实例四、总结一、两个长得有点像的变量 对volatile关键字,其实很多人只是能用,知道用到啥处,但其实应用的原理并不知道。在一些多...
    99+
    2022-11-13
  • C#中的const和readonly关键字详解
    const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1、声明const类型变量一定要赋初值吗? 一定要赋初值 public class Student ...
    99+
    2022-11-13
    C# const关键字 readonly关键字
  • C++中register关键字举例详解
    目录register 简介:register 的作用:补充知识:register函数的限制总结register 简介: register 就像是汉语和英语中的形容词(不要问为什么只有...
    99+
    2023-03-08
    cregister关键字 c++ register关键字 c++中的关键字
  • c++关键字const的用法详解
    目录C语言const的用法1、指向常量的指针变量const int *p指针指向int a;2、常指针(常地址)int * const p指针指向int a;3、指向常量的常指针co...
    99+
    2022-11-12
  • C++ explicit关键字的使用详解
    在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即...
    99+
    2022-11-12
  • C++ const关键字分析详解
    目录C语言中修饰变量C语言中修饰指针变量C语言中修饰函数的参数C++中修饰变量C++中修饰函数的参数C++中修饰函数的返回值C++中修饰类的成员函数C++中修饰类的成员变量总结C语言...
    99+
    2022-11-12
  • C++ new 和 delete 关键字详解
    目录前言new 和 delete 的使用newdelete为数组分配内存和释放内存malloc 和 newdelete 和 delete[]前言 最早接触到new这个关键字,是在 J...
    99+
    2022-11-13
  • C++ Explicit关键字详细解析
    explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字。首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用...
    99+
    2022-11-15
    Explicit 关键字
  • C语言关键字之autoregister详解
    目录一:auto作用域生命周期auto二:register总结:一:auto 在学习关键字auto之前我们需要先了解两个概念:作用域和生命周期。 作用域 作用域(scope)是程序设...
    99+
    2022-11-12
  • C++关键字之likely和unlikely详解
    目录什么是likely和unlikelylikely/unlikely的原理likely/unlikely的适用条件C++20中的likely/unlikely什么是likely和u...
    99+
    2022-11-13
    C++ likely和unlikely C++ likely和unlikely
  • 一文详解C++中的引用与关键字auto
    目录一.引用1.引用的概念2.引用的使用和问题3.引用与指针的比较二.关键字auto一.引用 1.引用的概念 引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。注意引用...
    99+
    2023-05-16
    C++ 引用 关键字auto C++引用 C++ 关键字auto
  • C#泛型详解及关键字作用
    这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用。 一、什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (C...
    99+
    2022-11-12
  • c语言static关键字用法详解
    目录1.static修饰全局变量2.static修饰函数3.static修饰局部变量总结:1.static修饰全局变量 我们创建两个源文件,一个test.c,一个main.c 现在...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作