1. 何为扩展方法

扩展方法是C#3.0引入的语法特性,是一种特殊的静态方法。它使得我们能向现有的数据类型“动态”添加方法,而不需要创建行的派生类型、重新编译或直接修改原始类型的源代码。

注意扩展方法的要点:

1). 扩展方法必须是静态的,并且要在一个非泛型的静态类中。

2). 扩展方法第一个参数前必须有一个this关键字,它指明扩展方法将“附加于”哪个类型的对象上。

2. 扩展方法与原始类型同名时,扩展方法永远不会被调用  eg:Tostring

namespace ConsoleApp5
{
public static class AV
{
public static string ToString<T>(this List<T> list)
{
var result = new StringBuilder();
foreach (var length in list)
result.Append(length);
return result.ToString();
}
} internal class Program
{
private static void Main(string[] args)
{
var list = new List<int> {, , };
Console.WriteLine(list.ToString());
Console.Read();
}
}
}

要想生效可以把toString 修改为toString1

namespace ConsoleApp5
{
public static class AV
{
public static string ToString1<T>(this List<T> list)
{
var result = new StringBuilder();
foreach (var length in list)
result.Append(length);
return result.ToString();
}
} internal class Program
{
private static void Main(string[] args)
{
var list = new List<int> {, , };
Console.WriteLine(list.ToString1());
Console.Read();
}
}
}

object中虚方法,在它的子类中不覆盖那就只能调用父类的虚方法

public virtual string ToString()
     {
         return this.GetType().ToString();
     }

重新写一个数据结构才能够使用override    比如public struct DateTime中的tostring

public struct Data
{
private double value;
public Data(double value){this.value = value;}
public override string ToString()
{
return Math.Round(this.value, , MidpointRounding.AwayFromZero).ToString("0.00");
}
public static Data operator +(Data data1, Data data2)
{
double d = data1.value + data2.value;
return new Data(d);
}
}

比如实体类中Tostring

public class People
{
private List<People> friends = new List<People>(); public int Id { get; set; }
public string Name { get; set; }
public DateTime Brithday { get; set; }
public People Son { get; set; }
public People[] Friends { get { return friends.ToArray(); } } public void AddFriend(People newFriend)
{
if (friends.Contains(newFriend)) throw new ArgumentNullException("newFriend", "该朋友已添加");
else friends.Add(newFriend);
}
public override string ToString()
{
return string.Format("Id: {0}, Name: {1}", Id, Name);
} }

3. 扩展方法的泛型版本

    static class MyExtensionMethods
{
public static void Test<T>(this T obj)
{
Console.WriteLine(obj.ToString());
}
}

在调用扩展方法时可以可以不指定泛型类型参数的具体类型。DateTime.Now.Test();但是在实际开发中,需要给出明确的参数类型。以免影响代码的可读性、

4. 目的

提升代码的可读性,避免写一些重复性的代码了,不然有写代码写很多遍,自己救回很烦;

 

C# 扩展方法一的更多相关文章

  1. JBOSS通过Apache负载均衡方法一:使用mod_jk

    JBOSS通过Apache负载均衡方法一:使用mod_jk   本文第一.二节分别对Linux环境下前端使用Apache以及windows环境下前端使用IIS通过AJP协议和后端的JBOSS通信实现负 ...

  2. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系

    XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...

  3. 【转载】.NET(C#): Task.Unwrap扩展方法和async Lambda

    .NET(C#): Task.Unwrap扩展方法和async Lambda 目录 Task.Unwrap基本使用 Task.Factory.StartNew和Task.Run的Unwrap操作 使用 ...

  4. centos6.5下oracle11g开机自动启动方法一

    转裁于 方法一 https://blog.csdn.net/wx5040257/article/details/77875690 方法二  https://blog.csdn.net/wx504025 ...

  5. mybatis由浅入深day02_2一对一查询_2.2方法一:resultType

    2 一对一查询 2.1 需求(查询所有订单信息,关联查询创建订单的用户信息) 查询所有订单信息,关联查询创建订单的用户信息 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用 ...

  6. 头像文件上传 方法一:from表单 方法二:ajax

    方法一:from表单 html 设置form表单,内包含头像预览div,内包含上传文件input 设置iframe用来调用函数传参路径 <!--表单提交成功后不跳转处理页面,而是将处理数据返回给 ...

  7. vue抽取公共方法———方法一

    方法一:Vue插件 1.概述 作用:满足vue之外的需求,特定场景的需求 比如说,让你在每个单页面组件里,都可以调用某个方法(公共方法),或者共享某个变量等 2.使用方法 [声明插件]- [写插件]- ...

  8. 扩展方法和Enumerable

    .NET中扩展方法和Enumerable(System.Linq) LINQ是我最喜欢的功能之一,程序中到处是data.Where(x=x>5).Select(x)等等的代码,她使代码看起来更好 ...

  9. LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

随机推荐

  1. Devexpress treelist 控件属性大全

    属性列表 1.OptionsSelection: EnableAppearanceForcusedCell:选中的Cell的Appearance设置是否可用.默认为True: EnableAppear ...

  2. artemplate模板

    artTemplate 介绍 最近使用了一款模板,学习成本比较低,性能也不错.觉得很好用,所以推荐给大家. artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了 ...

  3. python--基础数据类型 set集合

    一.set集合 set集合是python的一个基本数据类型,一般不是很常用.set中的元素是不重复的.无序的.里面的元素必须是可hash的(int, str, tuple, bool) 注意:   s ...

  4. shell脚本报错:-bash: xxx: /bin/bash^M: bad interpreter: No such file or directory

    当我们把文件从windows系统中编辑的文件拷贝到linux系统中,如果我们执行文件会保存如下的错: shell脚本报错:-bash: xxx: /bin/bash^M: bad interprete ...

  5. .Net开发工程师笔试试题

    第一部分[数据库技能] 附上自己做的答案,提出不足之处 现在有一个SQL Server 2000版本的数据库,里面包含有三个表Info.InfoReply.User,分别表示信息.信息评论和用户表,包 ...

  6. android learning

    https://www.cnblogs.com/kangjianwei101/p/5621238.html https://blog.csdn.net/write6/article/details/7 ...

  7. shell实战之case语句的选择提示

    知识点包括:case语句,cat多行输入,break和exit的区别,wget断点续传,while中断条件写法,函数的使用方法 #!/bin/bash echo "\n1. 本机容器情况如下 ...

  8. 代码 | 自适应大邻域搜索系列之(2) - ALNS算法主逻辑结构解析

    00 前言 在上一篇推文中,教大家利用了ALNS的lib库求解了一个TSP问题作为实例.不知道你萌把代码跑起来了没有.那么,今天咱们再接再厉.跑完代码以后,小编再给大家深入讲解具体的代码内容.大家快去 ...

  9. [redis]复制机制,调优,故障排查

    在redis的安装目录下首先启动一个redis服务,使用默认的配置文件,作为主服务 ubuntu@slave1:~/redis2$ ./redis-server ./redis.conf & ...

  10. ubuntu14 安装tftp服务器

    安装 sudo apt-get install tftp-hpa tftpd-hpa 配置 sudo gedit /etc/default/tftpd-hpa 打开tftpd-hpa修改里面的配置: ...