善用 C# 3.0 Extensions 方法

2024-02-24 06:32

本文主要是介绍善用 C# 3.0 Extensions 方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

或许大家觉得这东西过于简单以至于无需一提? 但是在我参与的项目中,其实很多适用于 Extension Method 的地方,大家却根本就没有意识到。

Extension Method 的一个主要用途便是构造辅助方法。 在编程中为了抽象和简化,我们会把一些常用但又不好专门为它们创建一个对象类的方法放到所谓的Helper 中,在使用时调用 Helper.Xxxx()。例如:

public static class Helper
{
public static SecureString ToSecureString(string value)
{
SecureString result = new SecureString();
foreach (char c in value.ToCharArray())
{
result.AppendChar(c);
}
return result;
}
public static T ToEnum<T>(string value, bool ignoreCase) where T : struct
{
return (T) Enum.Parse(typeof(T), value, ignoreCase);
}
}

我们通过调用 Helper.ToSecureString(“something”), Helper.ToEnum<BrowserType>(input, true) 等,但是各种不同目的的方法都通过以Helper类来引用总让人感觉有些不伦不类。如果采用Extension Method,事情可能就会简单许多:

public static class Extensions
{
public static SecureString ToSecureString(this string value)
{
// convert to SecureString
}
public static T ToEnum<T>(this string value, bool ignoreCase) where T : struct
{
// convert to enum.
}
}

使用的话也会干净许多:

static void Method(string password, string browserString)
{
SecureString secured = password.ToSecureString();
BrowserType browerType = browserString.ToEnum<BrowserType>(true);
}

Extension Method 的本质其实就是一个编译器魔法,编译器会把 password.ToSecureString() 替换成 Extensions.ToSecureString(password), 其编译生产的代码完全可以在.NET 2.0 下运行。另外,由于使用Extension Method,客户代码并没有引用类名 ”Extensions” or “Helper”, 使得我们当辅助方法越来越多而需要将Helper/Extension类拆分成诸如 StringHelper, XmlHelper, EnumHelper 的时候,客户代码不需要作任何修改。实际上这也符合一条设计原则 – Open Close 原则。

有人对Extension不以为然,认为需要使用 Extension 说明原有类型或接口的设计不完善或不仔细,其实这是两码事。类型设计的原则之一是单一职责,不应该让一些不相干的方法来污染了类型本身。 例如,ToSecureStirng 应该是 string 的一个方法吗? ToEnum 应该是它的功能吗?当然不是。 Extension Method的使用却是为了提供方便,提高可读性,或提供一些粘接能力。

我的工作之一是为团队编写一些Common的类型和方法,我会在后续的一些文章里列出一些我常用的Extension 方法,这篇算是一个目录吧。

这篇关于善用 C# 3.0 Extensions 方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741228

相关文章

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

C# Where 泛型约束的实现

《C#Where泛型约束的实现》本文主要介绍了C#Where泛型约束的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用的对象约束分类where T : structwhere T : classwhere T : ne

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil