c# 重载运算符(+-|&)和扩展方法
通常我们需要对class的相加,相减,相乘 等重载以适应需求, 如caml查询的时候,我们可以定义一个caml类,然后来操作这些查询. 首先,我们定义一个class为Test
public class Test
然后定义两个成员,一个int类型的ID,一个字符串类型的Name.
public int ID;
public string Name;
然后定义构造函数
public Test()
{
} public Test(int id)
{
this.ID = id;
} public Test(int id, string name)
{
this.ID = id;
this.Name = name;
}
重载两个class相加的运算符,
public static Test operator +(Test t1, Test t2)
{
if (t2.Name!= null)
{
return new Test(t1.ID + t2.ID, t1.Name + t2.Name);
}
else
{
return new Test(t1.ID + t2.ID);
}
}
重载两个class的|运算,其他的运算符如(-,*,/,&)大家可以自己去试试.
public static Test operator |(Test t1, Test t2)
{
//显示ID大的class
return new Test(t1.ID > t2.ID ? t1.ID:t2.ID);
}
下面写了一个对Test这个class的扩展方法,相等于这个class自带的成员方法. 扩展返回发的写法关键是this 后面带类型和参数
internal static class Util
{
public static string Format(this Test t)
{
StringBuilder sb = new StringBuilder();
if (t.ID != null)
{
sb.AppendLine("ID:"+t.ID.ToString());
}
if (!string.IsNullOrEmpty(t.Name))
{
sb.AppendLine("Name:" + t.Name.ToString());
}
return sb.ToString();
}
}
调用这个方法:
class Program
{
static void Main(string[] args)
{
//测试两个class相加
Test test1 = new Test();
Test test2 = new Test();
Console.WriteLine("两个class相加的结果为:"+(test1 +test2).Format());
Console.WriteLine("两个class比较值大的结果为:" + (test1 |test2).Format()); }
}
运行结果如下:
全部代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Charlie.ConsoleWindow
{
class Program
{
static void Main(string[] args)
{
//测试两个class相加
Test test1 = new Test();
Test test2 = new Test();
Console.WriteLine("两个class相加的结果为:"+(test1 +test2).Format());
Console.WriteLine("两个class比较值大的结果为:" + (test1 |test2).Format()); }
} public class Test
{
public int ID;
public string Name; public Test()
{
} public Test(int id)
{
this.ID = id;
} public Test(int id, string name)
{
this.ID = id;
this.Name = name;
} public static Test operator +(Test t1, Test t2)
{
if (t2.Name!= null)
{
return new Test(t1.ID + t2.ID, t1.Name + t2.Name);
}
else
{
return new Test(t1.ID + t2.ID);
}
} public static Test operator |(Test t1, Test t2)
{
//显示ID大的class
return new Test(t1.ID > t2.ID ? t1.ID:t2.ID);
}
} internal static class Util
{
public static string Format(this Test t)
{
StringBuilder sb = new StringBuilder();
if (t.ID != null)
{
sb.AppendLine("ID:"+t.ID.ToString());
}
if (!string.IsNullOrEmpty(t.Name))
{
sb.AppendLine("Name:" + t.Name.ToString());
}
return sb.ToString();
}
}
}
如有错误,请大家指正~~~~
c# 重载运算符(+-|&)和扩展方法的更多相关文章
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- C#高级功能(四)扩展方法和索引
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...
- 从C过渡到C++的几个知识点(结构体、引用、重载运算符)
一.结构体和类(class) 下面一个使用结构体类型的例子 #include <iostream> using namespace std; struct Point{ // 声明Poin ...
- C++ 重载运算符 继承 多态 (超详细)
(一)重载运算符: (1)声明与定义格式 一般是类内声明,类外定义,虽然可以在类内定义,但 写前面堆一堆不好看!!! 类内声明: class Demo { 返回值类型 operator 运算符(形参表 ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- C#中的扩展方法
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- 【开源】OSharp框架解说系列(3):扩展方法
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- IEnumerable<T>与IQueryable<T>以及.net的扩展方法
首先看看继承关系 public abstract class DbSet : DbQuery public abstract class DbQuery : IOrderedQueryable, IQ ...
随机推荐
- Table of Contents - JavaSE
Java Bean Lombok IO Commons-IO - IOUtils Regular Expression 正则表达式常用操作 Concurrency java.util.concurre ...
- Linux vi入门必备
一.vi.vim介绍 文本编辑器分为: (1)基于图形界面,如gedit.geany等: (2)基于命令行,如nano.vi.joe等: 每个命令行界面的文本编辑器都有各自不同的快捷键,比如nan ...
- C# 输出24小时格式时间
比如 MessageBox.Show(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); 会输出 2014-4-3 5:08:4[1 ...
- [老老实实学WCF] 第六篇 元数据交换
老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个 终结点上建立通道从而进 ...
- iOS数据持久化(二)SQLite
一.什么是SQLite SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,处理速度快,非常适合用于移动端开发. 二.使用 创建DataBaseHandle.h & DataB ...
- 20141017--循环语句whlie,do
int n = 0; ; ) {//n必须小于100,如果等于100则会再进来进行一次运算,变为101. //因为下面的语句中用到了continue,状态改变n++不能用到最后 n++; ) { m ...
- 对match() 和 exec() 返回值和属性的测试
语法: exec() : RegExpObject.exec(string) match() : stringObject.match(string) stringObject.match(regex ...
- Spring AOP整理
示例展示 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充.AOP之所以能得到广泛认可,主要是因为它将应用系统拆分分了 ...
- 《openstack 和hadoop的区别是什么?》
openstack 和hadoop的区别是什么? (一) openstack仿照的Amazon的云,hadoop仿照的是Google的云 openstack注重的是虚拟化/虚拟机及其配套的服务,had ...
- 转:关于Apache与Nginx的优势比较(经典)
不断有人跟我说Nginx比Apache好.比Apache快之类.Nginx更主要是作为反向代理,而非Web服务器使用.我翻译过一本关于反向代理的技术书籍,同时精通Apache API开发,对Nginx ...