C# 3.0 添加扩展方法扩展现有类
扩展方法是C# 3.0的又一个特性,它允许开发人员在不创建派生类型和不修改原始类型的基础上,直接向现有类型"添加"方法。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
包含扩展方法的类必须定义为静态(static)类,扩展方法也必须定义为静态(static)方法,它的第一个参数指定该方法被扩展到哪一个类型中,同时第一个参数要用this关键字修饰,扩展方法可以作为普通方法一样的方式被调用。
示例代码4-16演示扩展方法的使用。包含扩展方法的类ExtendMethods被定义为static类,扩展方法:IsRight()、PrintHint()都被定义为static方法,而且第一个参数都用this关键字修饰,表示该方法扩展到某个类型。其中,IsRight()方法被扩展到string和int类型,而PrintHint()方法则被扩展到object类型,这样,PrintHint()就可以被所有类型访问,因为所有类型都是object类型的子类。
示例代码4-16
publicstaticclass ExtendMethods
{
//定义string类型的扩展方法IsRight()
publicstaticbool IsRight(thisstring str)
{
switch (str.ToUpper( ).Trim( ))
{
case"RIGHT":
returntrue;
case"YES":
returntrue;
case"OK":
returntrue;
default:
returnfalse;
}
}
//定义一个int类型的扩展方法IsRight()
publicstaticbool IsRight(thisint val)
{
if (val >10)
{ returntrue; }
else
{ returnfalse; }
}
//定义一个对于所有类型的扩展方法,打印类信息同时添加一个字符串作为提示信息
publicstaticvoid PrintHint(thisobject obj, string hint)
{
System.Console.WriteLine(obj.ToString( ) +"--"+ hint);
}
}
namespace UseExtMethod
{
//必须显式声明使用ExtendMethods命名空间
using ExtendMethods;
class Program
{
staticvoid Main(string[] args)
{
//使用string类的扩展方法IsRight()
string str1 ="right", str2 ="err";
System.Console.WriteLine("str1.IsRight()
=" + str1.IsRight( ).
ToString());
System.Console.WriteLine("str2.IsRight()
=" + str2.IsRight( ).
ToString( ));
//使用int类型的扩展方法IsRight()
int i1 =11, i2 =5;
System.Console.WriteLine("i1.IsRight()
=" + i1.IsRight( ).
ToString( ));
System.Console.WriteLine("i2.IsRight()
=" + i2.IsRight( ).
ToString( ));
//使用Object类型的扩展方法PrintHint()
string str3 ="誓言";
str3.PrintHint("你好!");
}
}
}
{
//定义string类型的扩展方法IsRight()
publicstaticbool IsRight(thisstring str)
{
switch (str.ToUpper( ).Trim( ))
{
case"RIGHT":
returntrue;
case"YES":
returntrue;
case"OK":
returntrue;
default:
returnfalse;
}
}
//定义一个int类型的扩展方法IsRight()
publicstaticbool IsRight(thisint val)
{
if (val >10)
{ returntrue; }
else
{ returnfalse; }
}
//定义一个对于所有类型的扩展方法,打印类信息同时添加一个字符串作为提示信息
publicstaticvoid PrintHint(thisobject obj, string hint)
{
System.Console.WriteLine(obj.ToString( ) +"--"+ hint);
}
}
namespace UseExtMethod
{
//必须显式声明使用ExtendMethods命名空间
using ExtendMethods;
class Program
{
staticvoid Main(string[] args)
{
//使用string类的扩展方法IsRight()
string str1 ="right", str2 ="err";
System.Console.WriteLine("str1.IsRight()
=" + str1.IsRight( ).
ToString());
System.Console.WriteLine("str2.IsRight()
=" + str2.IsRight( ).
ToString( ));
//使用int类型的扩展方法IsRight()
int i1 =11, i2 =5;
System.Console.WriteLine("i1.IsRight()
=" + i1.IsRight( ).
ToString( ));
System.Console.WriteLine("i2.IsRight()
=" + i2.IsRight( ).
ToString( ));
//使用Object类型的扩展方法PrintHint()
string str3 ="誓言";
str3.PrintHint("你好!");
}
}
}
生成并运行示例代码4-16,得到程序输出如下:
str1.IsRight() = True
str2.IsRight() = False
i1.IsRight() = True
i2.IsRight() = False
誓言--你好!
str2.IsRight() = False
i1.IsRight() = True
i2.IsRight() = False
誓言--你好!
在使用扩展方法前需要显式引用扩展方法所在的命名空间,如示例代码4-16中的代码 "using ExtendMethods;"。另外,在扩展方法被调用时和普通的成员方法调用一样,扩展方法的第一个参数也需要在调用时指出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?