C#—委托分析

1.简单委托示例


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleTest
{
class Program
{
private delegate string GetAString(); //声明委托
static void Main(string[] args)
{
int x = 40;
GetAString delegateString = new GetAString(x.ToString); //委托接受一个参数的构造函数
GetAString delegateString1 = x.ToString; //将方法的地址赋值给委托变量 Tostring()是字符串对象
Console.WriteLine("string is {0}",delegateString());
Console.WriteLine("string1 is {0}", delegateString1());
}
}
}

输出结果

2.委托数组实现多播委托(调用多个方法) 包括func<T>委托方式

操作类(MathOperation)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleTest1
{
class MathOperation
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}

public static double Square(double value)
{
return value * value;
}
}
}

测试类


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleTest1
{
class Program
{
delegate double DoubleOP(double value); //声明委托

//将委托传递给方法
//委托作为第一个参数传递
private static void ProcessAndDisplayNumber(DoubleOP action,double value)
{
double result = action(value); //
Console.WriteLine("Value is {0},result of operation is {1}",value,result);
}

//利用Func<T>泛型实现委托
private static void ProcessAndDisplayNumber(Func<double, double> action, double value)
{
double result = action(value);
Console.WriteLine("Value is {0},result of operation is {1}", value, result);
}

static void Main(string[] args)
{
//方式一
//DoubleOP[] operations = // 实例化一个委托的数组,可以在循环中调用不同的方法
//{
// MathOperation.MultiplyByTwo,
// MathOperation.Square
//};

//方式二
Func<double, double>[] operations = //Func<T>允许调用带返回类型的方法
{
MathOperation.MultiplyByTwo,
MathOperation.Square
};

/*
* i=0的时候,即operations[0]委托的实例为 MathOperation.MultiplyByTwo,
* 调用ProcessAndDisplayNumber(operations[0],2.0)后
* double result = action(value); // action(value)相当于调用MathOperation.MultiplyByTwo(value)
* operations[i] 委托表示的方法,operations[i](2.0) 调用委托的商品
*/
for (int i = 0; i < operations.Length; i++)
{
Console.WriteLine("Using operations [{0}]:", i);
ProcessAndDisplayNumber(operations[i], 2.0);
ProcessAndDisplayNumber(operations[i], 7.84);
ProcessAndDisplayNumber(operations[i], 1.414);
Console.WriteLine();
}

}
}
}

输出结果

3.Action<T>实现多播委托改上上述测试样例

操作类(MathOperation)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Multicastdelegate
{
class MathOperations
{
public static void MultiplyByTwo(double value)
{
double result = value * 2;
Console.WriteLine("[{0}]Multiply by 2 = [{1}]:",value,result);
}

public static void Square(double value)
{
double result = value * value;
Console.WriteLine("[{0}]Square = [{1}]",value,result);
}
}
}


测试类:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Multicastdelegate
{
class Program
{
/// <summary>
/// 多播委托方式
/// </summary>
/// <param name="action"></param>
/// <param name="value"></param>
public static void ProcessAndDisplayNumber(Action<double> action,double value)
{
Console.WriteLine("ProcessAndDisplayNumber called with value={0}",value);
action(value);
}

static void Main(string[] args)
{
Action<double> operations = MathOperations.MultiplyByTwo;
operations+= MathOperations.Square; //+=向委托中添加方法

ProcessAndDisplayNumber(operations,2.0);
ProcessAndDisplayNumber(operations, 4.0);
}
}
}

输出结果:

4.对象排序的委托(冒泡排序)

冒泡算法类(BubbleSorter)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BubbleSort
{
/// <summary>
/// 冒泡排序
/// </summary>
class BubbleSorter
{
/// <summary>
/// comparison必须引用一个方法,该方法带有两个参数,如果第一个参数“小于”第二个参数返回true
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sortArray"></param>
/// <param name="comparison"></param>
static public void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
{
bool swapped = true;
do
{
swapped = false;
for (int i = 0; i < sortArray.Count - 1; i++)
{
if (comparison(sortArray[i + 1], sortArray[i]))
{
T temp = sortArray[i];
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
swapped = true;
}
}
} while (swapped);
}
}
}

职工信息类(Employee)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BubbleSort
{
class Employee
{
public string Name { get; set; }
public decimal Salary { get; set; }
public override string ToString()
{
return string.Format("{0},{1:C}", Name, Salary);
}

public Employee(string name, decimal salary)
{
this.Name = name;
this.Salary = salary;
}

/// <summary>
/// 为了匹配冒泡排序的Func<T, T, bool> comparison必须定义如下方法
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <returns></returns>
public static bool CompareSalary(Employee e1, Employee e2)
{
return e1.Salary < e2.Salary;
}
}

}

测试类


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BubbleSort
{
class Program
{
static void Main(string[] args)
{
Employee[] employees =
{
new Employee("小张", 2000),
new Employee("小王", 3000),
new Employee("小李", 4000),
new Employee("小赵", 2500)
};

BubbleSorter.Sort(employees, Employee.CompareSalary); //利用委托对对象排序

foreach (var employee in employees)
{
Console.WriteLine(employee);
}

}
}
}

输出结果:

时间: 2024-11-03 20:49:22

C#—委托分析的相关文章

jQuery-1.9.1源码分析系列(十) 事件系统——事件委托

jQuery的事件绑定有几个比较优秀的特点: 1. 可以绑定不限数量的处理函数 2. 事件可以委托到祖先节点,不必一定要绑到对应的节点 3. 链式操作 下面主要分析事件的委托设计.事件源我们成为委托节点,委托节点委托他的祖先节点替他执行事件处理,这个祖先节点被成为被委托节点. DOM的原生事件将处理绑定在相应的节点上,相应节点触发事件才能执行处理.将事件处理委托给祖先节点,这个事件处理是附加到祖先节点的.那么需要做到的是,原节点触发了事件,想要执行已经附加到祖先节点的事件处理那么就需要保证祖先节

C++11实现模板手柄:委托构造函数、defaultkeyword分析

C++11.使用委托构造函数.和高速变量初始化,defaultkeyword重新声明默认构造函数,回答pod状态. 分析与推荐的方法. 到目前为止,VS2012和2013异常声明兼容还是停留在通信代码级,查,出现例如以下错误可忽略. warning C4290: 忽略 C++ 异常规范,但指示函数不是 __declspec(nothrow) 下为:VS2012不支持托付构造函数.建议使用cocos2d-x 3.2及版本号的朋友更新VS至2013版. 1>d:\cpp_lab\testqueue_

类加载器深入理解和双亲委托模型的案例分析

类加载器深入理解和双亲委托模型的案例分析 我们知道类必须通过类加载器加载后,我们程序才可以使用.接下来我们就对类加载器进行分析,Java虚拟机的类加载器是如何加载类的.首先我们可以从ClassLoader的源码分析入手. ClassLoader 的源码分析 ClassLoader 的javadoc文档 javadoc文档是最权威的官方讲解,可以对ClassLoader有一个比较全面且正确的一个认知.下面是javadoc内容. A class loader is an object that is

jQuery的事件委托实例分析

事件委托主要是利用事件冒泡现象来实现的,对于事件委托的精准的掌握,可以有利于提高代码的执行效率.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>脚本之家</title> <style type="text/css"> table{ width:300px; height:60px; backg

[C#]委托实例分析

一直都听说C#中的委托与事件非常重要,都没有什么切身的体会,而这次通过做一个WinForm二次开发的项目才真正感觉到了委托与事件的犀利之处. 1.C#中的事件和委托的作用? 事件代表一个组件能够被关注的一种信号,委托是可以把一个过程封装成变量进行传递并且执行的对象. 2.他们之间的关系? 委托是一种类型,事件是一种成员,就相当于public int Age {get;set;}这个属性中,int就是类型,Age是一个成员,public event EventHandler Push;这个事件中E

ImageMagick 命令执行分析

ImageMagick是一款使用量很广的图片处理程序,很多厂商都调用了这个程序进行图片处理,包括图片的伸缩.切割.水印.格式转换等等.但近来有研究者发现,当用户传入一个包含『畸形内容』的图片的时候,就有可能触发命令注入漏洞. 国外的安全人员为此新建了一个网站: https://imagetragick.com/ ,不得不说,有些外国人蛮会玩的. 相对于之前的数个拥有『主页』的漏洞,这个洞确实不一般,确实是一个可以被利用的好洞,乌云主站上也爆出了数个被该漏洞影响的大厂商.我们先来分析一下它出现的原

C#知识点-委托

一.什么是委托 委托和类一样,是一种用户自定义类型: 类表示的是数据和方法的集合,而委托则持有一个或多个方法: 二.委托的使用 1.声明委托类型 委托是类型,与类一样,委托类型必须在被用来创建变量以及类型的对象之前声明: 注意: 以delegate关键字开头: 没有方法主体: 2.创建委托对象 委托是引用类型,因此有引用和对象: 方式一:使用带new运算符的对象创建表达式 方式二:快捷方式,方法名称和其相应的委托类型之间存在隐式转换 3.给委托赋值 由于委托是引用类型,通过赋值来改变包含在委托变

类加载的父亲委托机制

我们都知道.类加载器用来把类加载到java虚拟机.从JDK2.0开始,类的加载过程采用父亲委托机制.JVM的ClassLoader采用的是树形结构,除了根类加载器以外,每个ClassLoader都会有且仅有一个父类加载器,用户自定义的ClassLoader默认的父类加载器是系统类加载器,当然你可以自己指定需要用个ClassLoader的实例,我们来看他们的父子关系: 父类委托机制中,当一个java程序请求加载器loader1加载Hello类时,loader1首先委托自己的父亲加载器加载hello

struts2请求过程源码分析

Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定.性能优异.设计成熟的WEB框架. 我这里的struts2源码是从官网下载的一个最新的struts-2.3.15.1-src.zip,将其解压即可.里面的目录页文件非常的多,我们只需要定位到struts-2.3.15.1\src\core