《CLR Via C# 第3版》笔记之(九) - 扩展方法和分部方法

简介:

主要内容:

  • 扩展方法
  • 分部方法

1. 扩展方法

C#中的扩展方法实现起来非常简单,园子里也有很多写的很好的介绍扩展方法的文章。

这里就不在举例说明扩展方法了,只记录一下在实现扩展方法时应注意的原则和规则。

1)C#目前只支持扩展方法,不支持扩展属性,扩展事件等

2)扩展方法必须在非泛型的静态类中声明

3)定义扩展方法的静态类必须有文件作用域,即不能嵌套在某个类中

4)多个静态类中如果包含相同的扩展方法,编译时出错(error CS0121)

5)用扩展方法扩展了一个类型的同时,也扩展此类型的派生类型

6)扩展方法有潜在的版本控制问题。

     原因:类型在调用方法时,总是先找类型本身定义的方法,如果没找到对应的方法,再去找静态类中的扩展方法。

     如果类型升级后也包含了现有的扩展方法,那么现有的代码就调用不到扩展方法了。

2. 分部方法

C#中的分部方法有点类似与C/C++中的头文件(.h)和实现文件(.c或.cpp)。但是限制更多。

利用分部方法,可以将方法的声明和实现分开在两个文件中。而且声明文件中声明的方法可以没有实现部分。

我觉得分部方法可以应用在以下场景:

将工具生成的代码和开发人员生成的代码分开,如工具生成声明文件,开发人员根据具体情况来写代码文件中的实现。

这样,工具重新生成声明文件时,开发人员的代码文件不受影响。

下面用个简单的例子来说明分部方法如何使用:

CLRviaCSharp_9_def.cs为声明文件

namespace Test9
{
    public partial class CLRviaCSharp_9
    {
        private string myName;
        public string MyName
        {
            get {
                ToUpperWhenGetName(); 
                return myName;
            }
            set { myName = value; }
        }

        partial void ToUpperWhenGetName();
    }
}

CLRviaCSharp_9.cs为实现文件

using System;

namespace Test9
{
    public partial class CLRviaCSharp_9
    {
        partial void ToUpperWhenGetName()
        {
            myName = myName.ToUpper();
        }

        static void Main(string[] args)
        {
            CLRviaCSharp_9 c9 = new CLRviaCSharp_9();
            c9.MyName = "myname";
            Console.WriteLine(c9.MyName);

            Console.ReadKey(true);
        }
    }
}

执行后,终端上打印的MyName属性已经变成全部大写字母的了,虽然赋值的时候是小写字母。

在使用分部方法时,同样也有一些重要的原则和规则:

1)分部方法只能在分部类或结构中声明

2)分部方法返回值必须为void型

3)分部方法可以有ref参数,但不能有out参数。因为分部方法可以没有实现部分,所以不能初始化out参数。

4)分部方法的声明和实现的签名必须完全一致

5)如果分部方法没有实现部分,便不能在代码中创建一个委托来引用这个分部方法。

6)分部方法总是被视为private的。并且,分部方法的声明前不得添加private修饰。



本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/archive/2011/07/01/2095279.html,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
数据采集 数据可视化 测试技术
C#生成Selenium测试报告:实用方法与技巧
在C#中使用Selenium进行自动化测试时,结合代理IP和ExtentReports能增强测试安全性和报告质量。安装必备工具如Selenium WebDriver、NUnit和ExtentReports。在测试设置中,配置代理(如亿牛云爬虫代理)以隐藏IP,通过ChromeOptions定制UserAgent,并添加Cookie。测试代码示例展示了如何打开网页、执行搜索并生成详细的测试报告。使用ExtentReports可创建可视化测试结果,便于团队分析。
C#生成Selenium测试报告:实用方法与技巧
|
8天前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
24 0
|
25天前
|
C#
C# async await 异步执行方法
C# async await 异步执行方法
34 0
|
27天前
|
C# 图形学
小功能⭐️C#控制小数点后位数的方法
小功能⭐️C#控制小数点后位数的方法
|
1月前
|
C#
WPF/C#:数据绑定到方法
WPF/C#:数据绑定到方法
28 0
|
3月前
|
关系型数据库 C# 数据库
技术笔记:MSCL超级工具类(C#),开发人员必备,开发利器
技术笔记:MSCL超级工具类(C#),开发人员必备,开发利器
38 3
|
3月前
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
40 0
|
3月前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
43 0
|
4月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
157 3
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
173 3