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编程入门(四)界面介绍及小控件隐藏
感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...
- sql游标循环结果集
我们知道游标是一种对结果集操作的神器,使用游标,可以很方便的循环结果集,并对结果集进行数据处理. 1.建表 CREATE TABLE [dbo].[Student]( ,) NOT NULL, ) N ...
- 2018-2019 20165219 网络对抗 Exp5 MSF基础
实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms ...
- P4016 负载平衡问题 网络流
P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运 ...
- C语言多线程编程一
1. Windows下同时打开多个对话框: #include <Windows.h> #include <process.h> //创建线程 void runmsg(void ...
- zookeeper 高可用集群搭建
前言 记录Zookeeper集群搭建的过程! 什么是 Zookeeper ? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hado ...
- C#-WebForm-网页中Form表单中给回车绑定按钮
WEB端: <form id="form1" runat="server" defaultbutton="btnSearch" ...
- IntelliJ IDEA 18 周岁,吐血推进珍藏已久的必装插件
IntelliJ IDEA是目前最好最强最智能的Java IDE,前几天,他刚刚年满18岁.  本文,给大家推荐几款我私藏已久的,自己经常使用的,可以提升代码效率的插件. IDEA插件简介 常见的I ...
- 前端知识总结--BFC
Block Formatting Context,中文直译为块级格式上下文. 1. BFC的定义 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和 ...
- 升级vue-cli为 cli3 并创建项目
一.升级npm install -g @vue/cli 二.创建项目 1.vue create vue3-project 下面会提示让你配置下自己想要用到的功能,然后它会自动帮你安装,这个看自己需求 ...