博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[.NET 3.x新特性二]扩展方法
阅读量:6030 次
发布时间:2019-06-20

本文共 1792 字,大约阅读时间需要 5 分钟。

今天我们接着看一下.NET 3.x的新特性:扩展方法。这里需要说明的是我所说的.NET 3.x的新特性,其实是C# 3.0的一些新特性,考虑到LinQ等我就把这些特性叫做.NET 3.x新特性。可能这样叫会有些歧义,但是我还是觉的这样还好,闲话不多说让我们进入正题。我觉得在C#3.0中引入自动化属性等就已经减少了我们不少负担,而扩展方法是我最喜欢的,它提供的可视化提示中显得更为巧妙。但是我也会觉得有点烦琐,当一个类的扩展方法太多时,就像有LinQ存在的情况下,会出现一大批的提示方法......
    什么是扩展方法?他的语法又是怎么样的?让我们来看看。扩展方法必须定义在静态函数中,扩展的方法也必须是静态函数。这对于一些方法类的扩展提供了良好的支持,特别是对接口的补充更是极品啊,通常我们在用DataReader取对象时都需要一个转换,而通过dr(DataReader实例)的一些方法如:GetString(int),GetInt32(ing)...其中的参数都是列的索引,通常我们都需要填写列的名称,这样我们就可以对IDataReader接口进行扩展:
 1 
    
public
 
static
 
class
 Extensions
 2 
    {
 3 
        
public
 
static
 
string
 GetString(
this
 IDataReader dr,
string
 name) 
 4 
        {
 5 
            
return
 dr.GetString(dr.GetOrdinal(name));
 6 
        }
 7 
 8 
        
public
 
static
 
int
 GetInt32(
this
 IDataReader dr, 
string
 name) 
 9 
        {
10 
            
return
 dr.GetInt32(dr.GetOrdinal(name));
11 
        }
12 
    }

    
从上面我们也可以知道他的语法,首先要有一个静态类Extensions,对IDataReader接口的扩展,需要加入this IDataReader,而参数就是列名name。下面我们来看看他在VS中是怎么智能提示的呢?
    
在上面我们可以看到在dr对象中出现了上面扩展的提示(extension),原来IDataReader自带的只有一个GetString(int)方法,现在看到了有了个重载GetString(string)这样是不是感觉上好一点?注意:如果你要用此扩展必须引入所在的命名空间。
    在扩展方法中有一种继承作用,如果你在当扩展方法类(如上面的IDataReader)扩展,则他的子类也同样具有此扩展。如果我们想在所有类中都有的方法我们就可以对Object进行扩展,那样在所有类中都会具有此扩展的方法,只要你引用了他所做的空间。例如:我们如果要判断当前实例是否为集合或列表中的一个项,我们就可以对Object进行扩展,代码如下:
 1 
        
public
 
static
 
bool
 IsEmailAddress(
this
 
string
 text) 
 2 
        {
 3 
            Regex regex 
=
 
new
 Regex(
@"
^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$
"
);
 4 
            
return
 regex.IsMatch(text);
 5 
        }
 6 
 7 
        
public
 
static
 
bool
 IsIn(
this
 
object
 o, IEnumerable collection) 
 8 
        {
 9 
            
foreach
 (
object
 item 
in
 collection) 
10 
            {
11 
                
if
 (item.Equals(o))
12 
                    
return
 
true
;
13 
            }
14 
            
return
 
false
;
15 
        }

    我们可以在所有的对象中得到此扩展,可以参考下图:
    
我们知道其实整个LinQ都是方法的扩展,这个我们把它留到以后研究他时再说,因为LinQ有三大部分,一个是相对于类的,一个是To SQL的,还有一个是To XML的。当年都把他们叫做LinQ,DLinQ,XLinQ现在好像没有这么个教法,我们就顺从微软的意愿吧。
本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2007/09/05/dotnet_3x_extension_methods.html,如需转载请自行联系原作者
你可能感兴趣的文章
分数规划
查看>>
ArrayList源码分析
查看>>
POJ 1141 Brackets Sequence
查看>>
(译)KVO的内部实现
查看>>
如何利用线框图展示初期产品
查看>>
mybatis if标签比较字符串
查看>>
onethink后台编辑器 提示:未检测到兼容版本的flash
查看>>
【mybatis】mybatis中 的# 和 $的区别
查看>>
html2canvas在Vue项目踩坑-生成图片偏移不完整
查看>>
mysql数据库优化课程---15、mysql优化步骤(mysql中最常用最立竿见影的优化是什么)...
查看>>
Dcloud课程1 APP的架构有哪些
查看>>
各种编程语言功能综合简要介绍(C,C++,JAVA,PHP,PYTHON,易语言)
查看>>
php中命名空间和use
查看>>
el表达式判断字符串相等
查看>>
Redis哨兵原理详解
查看>>
IO调度算法研究1
查看>>
企业架构研究总结(2)——问题的由来和基本概念
查看>>
集群的定义以及类别定义
查看>>
Color the ball----HDOJ1556
查看>>
[开发工具]借助dillinger.io,在博客园写markdown
查看>>