[讨论]关于.NET3.5中新增的扩展方法功能

龙宜坡 2010-03-23 05:33:26
以下是.NET3.5中提供的扩展方法MSDN上简单示例:

using System;

namespace Test
{
class Program
{
static void Main(string[] args)
{
string s = "Hello Extension Methods";
int i = s.WordCount();

Console.WriteLine(i.ToString());
Console.ReadKey();
}
}

public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}




扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

通用准则
通常,建议您只在不得已的情况下才实现扩展方法,并谨慎地实现。只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。有关更多信息,请参见继承(C# 编程指南)。

在使用扩展方法来扩展您无法更改其源代码的类型时,您需要承受该类型实现中的更改会导致扩展方法失效的风险。

如果您确实为给定类型实现了扩展方法,请记住以下两点:

如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。

扩展方法被在命名空间级别放入范围中。例如,如果您在同一个名为 Extensions 的命名空间中具有多个包含扩展方法的静态类,则这些扩展方法将全部由 using Extensions; 指令放入范围中。

类库的实施者不应使用扩展方法来避免创建程序集的新版本。如果您要向库中添加重要的新功能,并且您拥有源代码,则应该遵循标准 .NET Framework 程序集版本控制准则。有关更多信息,请参见程序集版本控制。



试了试,确实方便!
大家不常提到这个话题,所以上来与大家讨论讨论.

请谈谈关于扩展方法的利弊,有那位朋友在项目中已经用到此种功能?
...全文
436 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jayrao5566 2012-04-26
  • 打赏
  • 举报
回复
来学习下.这个方法刚用到.比较强大
失去乐山贼 2011-06-17
  • 打赏
  • 举报
回复
学习了,不错。
龙宜坡 2010-03-24
  • 打赏
  • 举报
回复
看来担心是多余的.
fskang 2010-03-23
  • 打赏
  • 举报
回复
晕死,csdn的帖子不能编辑?

public static bool IsNull(this object o)
{
return o == null;
}

object o = null;
bool isnull = o.IsNull();

应该是这样......
总之扩展方法可以为同一对象衍生出不同的行为(创建不同的扩展方法)。我觉得扩展方法可以用在一些需要convert或者wrap的地方。过度使用扩展方法可能使代码变得难以理解,比如扩展方法再套扩展方法......
fskang 2010-03-23
  • 打赏
  • 举报
回复
呵呵,简单举两个例子。

第一个是关于验证的。

public static bool IsNull(this object o)
{
return object == null;
}

object o = null;
bool isnull = o.IsNull();

这个是个很有意思的用法,正常情况下o.IsNull()会引起一个空引用异常,但是用了扩展方法后有点小变化。:)

第二个是关于转换的。

public static EntityDto ToEntityDto(this Entity entity)
{
EntityDto result = new EntityDto();
//将entity转换成EntityDto。
......
return result;
}
var e = new Entity();
var dto = e.ToEntityDto();

通过扩展方法将实体类转换成数据传输对象。

其实我觉得扩展方法正如名字所说是一种扩展对象功能的一种机制。通过扩展方法,我们可以使得对象功能点分散,比如第二个例子。实体对象只应该表述领域内的概念,而数据传输对象应该只存在于webservice等传输层,通过扩展方法使得功能点分散了。当然我们通过提供一个类似于Convert的类也可以解决这个问题,但是扩展方法这种语法糖使得代码更加优雅,但也有可能使看代码的人一头雾水。呵呵。

yjp2006 2010-03-23
  • 打赏
  • 举报
回复
很好,,来学习下,。呵呵
amandag 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qldsrx 的回复:]
如果你曾添加过“using System.Linq;”这样的命名空间引用,那么你就已经用过微软提供的扩展方法了。
Linq的方法都是通过扩展方法的方式嵌入到原有的2.0的类当中的,所以你会发现就算是3.5的项目,核心部分的类还是基于2.0的,微软并没有重写那些类,只不过用了扩展方法这个技巧在运行时对类进行了补充。
[/Quote]
这个不错
龙宜坡 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qldsrx 的回复:]

如果你曾添加过“using System.Linq;”这样的命名空间引用,那么你就已经用过微软提供的扩展方法了。
Linq的方法都是通过扩展方法的方式嵌入到原有的2.0的类当中的,所以你会发现就算是3.5的项目,核心部分的类还是基于2.0的,微软并没有重写那些类,只不过用了扩展方法这个技巧在运行时对类进行了补充。
[/Quote]

很不错的一个知识,谢谢.
qldsrx 2010-03-23
  • 打赏
  • 举报
回复
如果你曾添加过“using System.Linq;”这样的命名空间引用,那么你就已经用过微软提供的扩展方法了。
Linq的方法都是通过扩展方法的方式嵌入到原有的2.0的类当中的,所以你会发现就算是3.5的项目,核心部分的类还是基于2.0的,微软并没有重写那些类,只不过用了扩展方法这个技巧在运行时对类进行了补充。
bancxc 2010-03-23
  • 打赏
  • 举报
回复
wuyi8808 2010-03-23
  • 打赏
  • 举报
回复
很不错的一个新功能.
龙宜坡 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wuyq11 的回复:]

扩展方法是一种快捷地扩展已有类型的方法定义和实现的机制
扩展方法必须声明在静态类中;
扩展方法只能针对实例调用;
如果考虑性能可以使用扩展方法
[/Quote]


......
icebintoo 2010-03-23
  • 打赏
  • 举报
回复
没看到过这个,学习
wuyq11 2010-03-23
  • 打赏
  • 举报
回复
扩展方法是一种快捷地扩展已有类型的方法定义和实现的机制
扩展方法必须声明在静态类中;
扩展方法只能针对实例调用;
如果考虑性能可以使用扩展方法
名字随便取 2010-03-23
  • 打赏
  • 举报
回复

学习了。
kate0824 2010-03-23
  • 打赏
  • 举报
回复
感觉参数列表中的this关键字挺有用的,我是说在多线程里。下去写个小程序测试一下去。
dgl_1225 2010-03-23
  • 打赏
  • 举报
回复
很神奇
龙宜坡 2010-03-23
  • 打赏
  • 举报
回复
看来又被微软Out了
十八道胡同 2010-03-23
  • 打赏
  • 举报
回复
我感觉很有用的。
但是我没用过
whowhen21 2010-03-23
  • 打赏
  • 举报
回复
有些用的,比如你对某个对象(系统内置)有特殊的要求,又不能更改系统本身的,只有这个东东能够解决问题,写方法没这个方便啊。。。
加载更多回复(2)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧