惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - hzwang

Administering your Windows Internal Database (MICROSOFT##SSEE) instance(转) VS 2008如何连接TFS 2010 learning F#(1):编程环境 learning F#: 开篇 Tip for using Fiddler on localhost (转载)ASP.NET MVC – Add CSS class Attribute I will write at least one blog every week 使用位逻辑运算来实现位向量 对象判等 sql bcp Utility工具使用 读代码随笔(一):using语句的使用 visitor(访问者)模式 - hzwang - 博客园 抽象类与接口(转) 在 C# 中实现 Singleton (转) 设置VSS2005使支持通过Internet访问 VSS使用手册 ASP.NET Forms 身份验证控制流 Cookie使用总结 不断努力,不断学习
C# 3.0 —— 扩展方法
hzwang · 2008-08-06 · via 博客园 - hzwang

扩展方法是C# 3.0新加入的特性,允许我们在不改变源代码的情况下扩展(即填加)现有类型中的实例方法,也给我们提供了另外一种扩展类型行为的方法(其它的方法为继承、组合、反射)

         下面我们来看一个代码示例:

    class Program
    
{
        
static void Main(string[] args)
        
{
            
string s = "hello ";
            s.SayTo(
"world");
            Extensions.SayTo(s, 
"world");
            
        }

    }


    
public static class Extensions
    
{
        
public static void SayTo(this string s,string name)
        
{
            Console.WriteLine(s 
+ name);
            
        }

    }

我们在Extensions类中定义了string类型的一个扩展方法SayTo(),从中我们可以看到扩展方法定义的几个特点:

1.       扩展方法的第一个参数有一个this关键字,就是这个this关键字才标识了这是个扩展方法。

2.       扩展方法的第一个参数是要扩展的类型,示例中扩展的是string类型。

3.       扩展方法只能在静态类中定义,而静态类中只能声明静态方法,因而扩展方法也都是静态的。

我们在Program类中使用了这个扩展方法,我们可以注意到我们用调用实例方法的方式调用了一个静态方法。在扩展方法的使用中我们应该注意到以下几个方面:

1.用类型的实例方法调用扩展方法时第一个参数不需要输入,输入了反而会报错。编译器在编译代码的时候实际上把s.SayTo("world")转化为了Extensions.SayTo(s, "world"),扩展方法的本质是将实例方法调用在编译期改为静态类中静态方法的调用。

2.扩展方法也可以用静态的方式调用,用Extensions.SayTo(s, "world")来取代s.SayTo("world"),效果是一样的。我们可以看一下IL代码

    L_0008: ldstr "world"

L_000d: call void Extensions.Extensions::SayTo(string, string)

         两个语句的调用都会产生这样相同的IL代码。

     3.扩展方法有他的优先级,现有实例的方法的优先级最高,其次为最近的namespace下的扩展方法,最后为较远namespace下的扩展方法。

    4.在进行类的设计的时候不要认为反正以后可以扩展,就不太认真的对待设计,这是不可取的。扩展方法一般用于扩展即有的,不易于修改的代码.