当前位置: 首页 > 编程日记 > 正文

C# 3.0 —— 扩展方法

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

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

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

    }


    
public static class Extensions
ExpandedBlockStart.gifContractedBlock.gif    
{
        
public static void SayTo(this string s,string name)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            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.在进行类的设计的时候不要认为反正以后可以扩展,就不太认真的对待设计,这是不可取的。扩展方法一般用于扩展即有的,不易于修改的代码.

转载于:https://www.cnblogs.com/whzh/archive/2008/08/06/1262171.html

相关文章:

Melkman's Algorithm

http://cgm.cs.mcgill.ca/~athens/cs601/Melkman.html https://maxgoldste.in/melkman/ 转载于:https://www.cnblogs.com/noryes/p/10406873.html

HDU1051Wooden Sticks

Wooden Sticks http://acm.hdu.edu.cn/showproblem.php?pid1051 #include<stdio.h> struct stick{ int w ; int l; int flag;}wood[5000],temp,r[]; int n ; //排序// int partition(struct stick r[],int first,int end){ int ifirst,jend; while(i<j){ while(i<…

spark编程基础--5.2键值对RDD

键值对RDD的创建 常用的键值对转换操作 reduceByKey(func) groupByKey() keys values sortByKey() mapValues(func) join combineByKey reduceByKey(func) reduceByKey(func)的功能是&#xff0c;使用func函数合并具有相同键的值 groupByKey() 上面得到的wordCountsWithReduce…

禁止选中文本事件

由于经常会些写错&#xff0c;为了以后节约时间&#xff0c;记录下&#xff1a; obj.on(click,.arrow,function(ev){console.log(click);ev.stopPropagation();ev.preventDefault();var rel $(this).attr(rel);if( rel && rel < totalPage && rel>0 ){g…

一套外企的数据库设计面试题

最近发现园子里面关于数据库方面的文章比较多&#xff0c;正好我也是一个喜欢凑热闹的家伙&#xff0c;那就跟着烧一把火吧。^_^ 这是前阵子一个朋友面试外企的一套关于数据库设计的试题&#xff0c;有兴趣的朋友不妨一试。 Part I 工厂在定义一个新产品的流程如下&#x…

持续集成(一)为什么我们迫切需要持续集成

摘录自&#xff1a;http://blog.csdn.net/kkkloveyou/article/details/53875987 为什么我们迫切需要持续集成&#xff08;Continuous Integration&#xff09; 持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;也就是我们经常说的 CI&#xff0c;是现代软…

spark编程基础--5.3数据读写

文件数据读写 1.本地文件系统的数据读写 1&#xff09;从文件中读取数据创建RDD 2&#xff09;把RDD写入到文本文件中 2.分布式文件系统HDFS的数据读写 3. JSON文件的读取 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript规范的…

试用最新版本的live writer发一篇日志看看

之前装Vs2008想弄WPF的时候&#xff0c;根据网上的说明&#xff0c;找VS2008的SP1&#xff0c;windows SDK的时候颇费周折&#xff0c;虽然说微软上面可以直接下&#xff0c;但是我找了半天才找到&#xff0c;总是觉得麻烦。现在就把一些WPF的相关前期准备软件的地址发出来&…

守护网络安全,我们一直在努力

据外电消息&#xff0c;日前&#xff0c;一种通过发布有关北京奥运会虚假信息的邮件来传播新型网络病毒&#xff0c;正在席卷全球。报道中写道&#xff0c;一封号称内容有关“北京奥运会可能因四川大地震取消和延迟”的电子邮件成为了“新型蠕虫恶意***程序”的源头&#xff0c…

DELPHI 中 Window 消息大全使用详解

Window 消息大全使用详解导读&#xff1a; Delphi是Borland公司的一种面向对象的可视化软件开发工具。 Delphi集中了Visual C和Visual Basic两者的优点&#xff1a;容易上手、功能强大&#xff0c;特别是在界面设计、数据库编程、网络编程方面更有其独特的优势。 Delphi中的消息…

vue 在浏览器控制台怎么调试 谷歌插件vue Devtools

vue 在浏览器控制台怎么调试 谷歌插件vue Devtools 问题&#xff1a; vuejs里面的变量&#xff0c;怎么用浏览器的console查看&#xff1f; 例如&#xff0c;想在chrome里用console.log查看变量$data&#xff0c;会显示undefined。 解决方案: 再main.js里面声明window.Vue new…

spark编程基础--5.4综合实例

操作指令如下&#xff1a; cd /usr/local/hadoop./sbin/start-dfs.sh./bin/hdfs dfs -mkdir -p spark/mycode/rdd/TopN./bin/hdfs dfs -put /usr/local/spark/mycode/TopN_file1.txt spark/mycode/rdd/TopN ./bin/hdfs dfs -put /usr/local/spark/mycode/TopN_file2.txt spark…

关于C#中的DLLImport (引)

MSDN中对DllImportAttribute的解释是这样的&#xff1a;可将该属性应用于方法。DllImportAttribute 属性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求&#xff0c;必须提供包含入口点的 DLL 的名称。 并给了一个示例&#xff1a; [DllImport("KERNEL…

Bootstrap框架和inconfont、font-awesome使用

Bootstrap框架和inconfont、font-awesome使用 iconfont的使用&#xff1a;https://www.cnblogs.com/clschao/articles/10387580.html Bootstrap介绍 Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。 它是为实现快速开发Web应用程序而设计的一套前端工具包。 它…

spark编程基础--6.DataFrame

使用spark安装时自带的样例数据people.json文件&#xff0c;生成DataFrame&#xff1a; 下面从示例文件people.json中创建一个DataFrame&#xff0c;然后保存成csv格式文件&#xff0c;代码如下&#xff1a; scala> val peopleDF spark.read.format("json").loa…

firebug 的使用

[Firebug - Console控制台视图] console API文档, http://www.getfirebug.com/console.html console.info显示(i)图标 在输出时&#xff0c;需要注意第一个参数被自动识别为格式字符串 需要在页面加载前启动firebug&#xff0c;当页面加载后启动firebug时&#xff0c;就没有…

cisco PIX防火墙的配置及注解完全手册

PIX Version 6.3(1)interface ethernet0 auto 设定端口0 速率为自动interface ethernet1 100full 设定端口1 速率为100兆全双工interface ethernet2 auto 设定端口2 速率为自动nameif ethernet0 outside security0 设 定端口0 名称为 outside 安全级别为0nameif ethernet1 insi…

C/C++:*(p++)慎用!!!!!

各位代码界的大佬大家好&#xff0c;今天跟大家分享一个在C/C中常用&#xff0c;但是很危险的一串代码——*(p) 为什么说这一行代码比较危险呢&#xff0c;因为对于C/C来说&#xff0c;成也指针&#xff0c;败也指针。C/C中指针便于我们操作一块连续的内存空间中内容&#xff0…

Kindeditor学习中的那些坑

Kindeditor富文本编辑器还算比较好上手的一款插件吧&#xff0c;下面记录一下我在学习和实践中遇到的那些坑。 编辑器初始化方法和参数网上一搜一大把&#xff0c;不想搜的点这里&#xff0c;文档上各个参数已经写得很清楚了&#xff0c;直接拿过来用就OK 开始说一些实际用到时…

java2实用教程--第二章基本数据类型与数组

基本数据类型--浮点类型 public class Example2_1 {public static void main (String args[]) {char chinaWord 好,japenWord あ;char you \u4F60;int position 20320;System.out.println("汉字&#xff1a;"chinaWord"的位置&#xff1a;"(int)china…

EntityCURD操作的参数和返回值

以下是netbeans根据实体自动生成的CURD模板&#xff1a;/** To change this template, choose Tools | Templates* and open the template in the editor.*/package com.medea.order.session;import com.medea.order.entity.Storeorder;import java.util.List; import javax.ej…

[ZT]SQL Server 的事务日志意外增大或充满的处理方法

http://support.microsoft.com/kb/317375 事务日志文件Transaction Log File是用来记录数据库更新情况的文件&#xff0c;扩展名为ldf。在 SQL Server 7.0 和 SQL Server 2000 中&#xff0c;如果设置了自动增长功能&#xff0c;事务日志文件将会自动扩展。一般情况下&#xff…

powershell真香

写毕设开题报告&#xff0c;从PDF复制后会有多余空格&#xff0c;一个一个手动删除略显麻烦。 delete.cpp#include<iostream> #include<cstdio> #include<string> #include<vector> using namespace std; int main() {//freopen("UAS.txt",&…

背包的硬币问题

在一个国家仅有1分&#xff0c;2分&#xff0c;3分硬币&#xff0c;将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。 HDU 1284 #include <iostream> using namespace std;const int M 32768 10;int dp[M];int main() {int n;while (~scanf("%d&q…

【转帖】OnPreRender Render的区别

转自&#xff1a;http://hi.baidu.com/trip008/blog/item/d6139ab77b5414f130add1e9.html protected override void OnPreRender(EventArgs e) protected override void Render(HtmlTextWriter writer) 这两个的区别。可否告知 asp.net页面在触发各个子控件的事件之后&#…

微信小程序如何进行登录授权和获取用户信息

微信小程序如何进行登录授权和获取用户信息

禁止windows系统的自动运行功能

禁用Windows 系统的自动播放功能的方法&#xff1a;在运行中输入 gpedit.msc 后回车&#xff0c;打开组策略编辑器&#xff0c;依次点击&#xff1a;计算机配置&#xff0d;&#xff1e;管理模板&#xff0d;&#xff1e;系统&#xff0d;&#xff1e;关闭自动播放&#xff0d;…

WCF配置文件全攻略

Code<?xml version"1.0" encoding"utf-8" ?><configuration> <system.ServiceModel> <!-- services 元素包含应用中驻留的所有service的配置要求 --> <services> <!-- 每个服务的…

图的算法专题——最小生成树

概要&#xff1a; Prim算法Kruskal算法1、Prim算法 算法流程&#xff1a; &#xff08;1&#xff09;对图G&#xff08;V,E&#xff09;设置集合S来存放已被并入的顶点&#xff0c;然后执行n次&#xff08;2&#xff09;&#xff08;3&#xff09; &#xff08;2&#xff09;每…

GridControl摘录

gvCabTotalInfo.Columns["出线平均<br>电压"].SummaryItem.SummaryType DevExpress.Data.SummaryItemType.Average; gvCabTotalInfo.Columns["出线平均<br>电压"].SummaryItem.DisplayFormat "平均:{0:N2}"; gvCabTotalInfo.Refre…