《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,如需转载请自行联系原作者

目录
相关文章
|
6天前
|
程序员 C#
C#抽象类和抽象方法详解
C#抽象类和抽象方法详解
9 0
|
6天前
|
存储 开发框架 .NET
C#中将DataTable转化成ListT的方法解析
C#中将DataTable转化成ListT的方法解析
8 0
|
7天前
|
数据采集 前端开发 数据挖掘
Fizzler库+C#:从微博抓取热点的最简单方法
本文介绍如何使用Fizzler库和C#构建微博热点信息爬虫。通过Fizzler的CSS选择器定位关键信息,提取热点标题和排名,实现微博内容的智能挖掘。示例代码展示单线程和多线程采集方法,并涉及代理IP使用。
Fizzler库+C#:从微博抓取热点的最简单方法
|
8天前
|
存储 数据采集 API
C# GetField 方法应用实例
C# GetField 方法应用实例
|
8天前
|
JSON 安全 API
C# GetMethod 方法应用实例
C# GetMethod 方法应用实例
|
24天前
|
设计模式 IDE 测试技术
提升 C#编程效率的技巧与方法
【4月更文挑战第20天】提升C#编程效率的关键技巧包括:选择合适的IDE(如Visual Studio)、掌握基础语法、规划良好代码结构、使用代码生成工具、复用代码、利用库和框架、定期重构、应用设计模式、避免过度设计、进行代码审查、自动化测试、学习新技术、养成良好编程习惯、定期备份代码及参与技术社区。通过这些方法,开发者能提高代码质量和开发效率。
|
1月前
|
C#
C# Dev TreeList常用属性方法
C# Dev TreeList常用属性方法
|
23天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
23天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
23天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。