C# 扩展方法一
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# 扩展方法一的更多相关文章
- JBOSS通过Apache负载均衡方法一:使用mod_jk
JBOSS通过Apache负载均衡方法一:使用mod_jk 本文第一.二节分别对Linux环境下前端使用Apache以及windows环境下前端使用IIS通过AJP协议和后端的JBOSS通信实现负 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系
XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...
- 【转载】.NET(C#): Task.Unwrap扩展方法和async Lambda
.NET(C#): Task.Unwrap扩展方法和async Lambda 目录 Task.Unwrap基本使用 Task.Factory.StartNew和Task.Run的Unwrap操作 使用 ...
- centos6.5下oracle11g开机自动启动方法一
转裁于 方法一 https://blog.csdn.net/wx5040257/article/details/77875690 方法二 https://blog.csdn.net/wx504025 ...
- mybatis由浅入深day02_2一对一查询_2.2方法一:resultType
2 一对一查询 2.1 需求(查询所有订单信息,关联查询创建订单的用户信息) 查询所有订单信息,关联查询创建订单的用户信息 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用 ...
- 头像文件上传 方法一:from表单 方法二:ajax
方法一:from表单 html 设置form表单,内包含头像预览div,内包含上传文件input 设置iframe用来调用函数传参路径 <!--表单提交成功后不跳转处理页面,而是将处理数据返回给 ...
- vue抽取公共方法———方法一
方法一:Vue插件 1.概述 作用:满足vue之外的需求,特定场景的需求 比如说,让你在每个单页面组件里,都可以调用某个方法(公共方法),或者共享某个变量等 2.使用方法 [声明插件]- [写插件]- ...
- 扩展方法和Enumerable
.NET中扩展方法和Enumerable(System.Linq) LINQ是我最喜欢的功能之一,程序中到处是data.Where(x=x>5).Select(x)等等的代码,她使代码看起来更好 ...
- LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
随机推荐
- cesium随笔 — 简单实现获取三维范围(包括相机高度)
代码 // 获取当前三维范围 function getCurrentExtent() { // 范围对象 var extent = {}; // 得到当前三维场景 var scene = viewer ...
- Cesium Language (CZML) 入门1 — CZML Structure(CZML的结构)
原文:https://github.com/AnalyticalGraphicsInc/cesium/wiki/CZML-Structure CZML是一种用来描述动态场景的JSON架构的语言,主要用 ...
- WPF GridControl单元格值与过滤值相同时,改变单元格背景色
DataTrigger的Value不可绑定,所以我们需要用MultiBinding来实现这个功能. <dxg:TableView.CellStyle> <Style TargetTy ...
- WCF快速上手(二)
服务端是CS程序,客户端(调用者)是BS程序 一.代码结构: 二.服务接口Contract和实体类Domain INoticeService: using Domain; using System; ...
- epoll好文章
https://www.cnblogs.com/apprentice89/p/3234677.html https://www.jianshu.com/p/aa486512e989 https://c ...
- django系列3.1--url路由配置, 正则, 分发include, 分组命名匹配
一.url配置 在django项目中urls.py文件中就是为这个url调用的view(视图)函数之间的映射表,来配置访问的一个url执行什么代码 默认的基本格式: from django.conf. ...
- GO学习笔记 - 用defer来实现try{}finally{}
在Delphi中,try{}finally{}语句非常有用,对于一定要最终执行的语句,我们放到finally,从而保证程序顺利执行!在GO语言中没有try{}finally{}语句,但是GO语言用另外 ...
- 关于Tomcat控制台乱码解决办法___ 解决 IntelliJ IDEA Tomcat 控制台中文输出乱码问题
Tomcat 控制台UTF-8乱码问题 1.修改cmd的编码格式 快捷键win+R打开运行程序,输入regedit打开注册表,找到以下路劲并且修改. [HKEY_LOCAL_MACHINE\SOFTW ...
- Unable to access 'default.path.data' (/var/lib/elasticsearch)
- Google 里的软件工程学
简评:原文作者 Fergus Henderson 在 Google 工作了 10 年以上,目前负责 Google 的 text-tospeech 工程小组.有很多书籍或文章会从 商业/管理 等非技术角 ...