系统訪问数据或调用方法有两种操作方式:一种是通过名称訪问或调用,还有一种是通过所在的内存地址来訪问调用。为了系统的安全与稳定,NET
Framework的CLR库不同意程序通过指针来直接操作内存中数据或方法。而是通过托管机制来訪问内存中数据或调用内存中的方法。托付就是C#提供的一种以托管机制调用方法的特殊数据类型,其作用于房屋租凭中介机构类似。

 

以下我们主要环绕以下三点

 

    //1.定义托付  

    //2.托付的实例化 

    //3.托付的调用。实际上是将托付指向已经实现的某个方法 

 

    //注意:调用的方法必须返回类型和定义的托付返回类型一致 

 

 

 托付是一个类,它定义了方法的类型,使得能够将方法当做參数进行传递。

 

一:托付的定义

 

在C#中使用keyworddelegate声明托付。声明托付的一般形式是:

 

//托付的定义

// [訪问修饰符]  delegate  数据类型  托付名(參数列表....)

在使用托付前是一定先要定义的


比如:Delegate void d(int x)

二:实例化( 与方法绑定) 



为了与命名方法一起使用,托付必须用具有可接受签名的方法进行实例化。

 

实例化的方法可用下列方法各项之中的一个

  • “托付创建表达式”中引用的静态方法,或者
  • “托付创建表达式”中引用的目标对象(此对象不能为 null)和实例方法
  •  还有一个托付

比如:

Delegate void d(int x)

delegate void D(int x);
class C
{
public static void M1(int i) {...}
public void M2(int i) {...}
}
class Test
{
static void Main() {
D cd1 = new D(C.M1); // static method
Test t = new C();
D cd2 = new D(t.M2); // instance method
D cd3 = new D(cd2); // another delegate
}
}

三.托付调用



 

创建托付对象后,通常将托付对象传递给将调用该托付的其它代码。通过托付对象的名称(后面跟着要传递给托付的參数,括在括号内)调用托付对象。以下是托付调用的演示样例:

public delegate int MathOp(int i,int j);//定义托付
class DelegateTest
{
public static int add(int i, int j) {//方法
return i + j;
}
public static int Mutiply(int num1, int num2) {//方法 return num1 * num2; } static void Main(string[] args)
{
MathOp mo = new MathOp(add);//托付的实例化,指向add方法
MathOp maOp = new MathOp(Mutiply);//托付的实例化,指向Mutiply方法 Console.WriteLine(mo(10, 20));//托付的调用
Console.WriteLine(maOp(4, 5));//托付的调用 Console.ReadLine();
}
} }

认识:



曾经对托付的认识仅仅是知道托付是方法的调用。通过这次的项目实例了解到托付也是须要定义,实例化与调用的。

还是先前学艺不精占呀。

托付的使用通常与匿名函数或lambda表达式匹配使用,下篇介绍匿名函数

 

版权声明:本文博主原创文章,博客,未经同意不得转载。

c#委托实例化和调用语句的更多相关文章

  1. 为什么super()和this()调用语句不能同时在一个构造函数中出现的解释

    我想这应该是Java构造函数的一种机制吧,首先以子类和父类为例.当你创建一个子类的实例时,首先会调用父类的构造函数,然后再调用子类的构造函数,如果父类中没有缺省构造函数,则必须再子类的构造函数中显示的 ...

  2. 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

    反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法)   创建Delegate (1).Delegate.CreateDelegate(Type, ...

  3. C#委托的异步调用1

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  4. C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  5. discuz 万能SQL查询调用语句写法

    首先在最底层source\class\table写入底层安全调用文件例如:table_common_friendlink.php 代码: <?php /** * [Discuz!] (C)200 ...

  6. java 实例化是调用了子类重写方法

    java 实例化时调用了抽象方法或者class里面某个方法,如果子类有重写改方法,实际运行的是子类重写方法 package auto.test; //抽象父类 public abstract clas ...

  7. C#委托的异步调用【转】

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  8. C# 委托的同步调用和异步调用

    委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System; using System.T ...

  9. Oracle 存储过程调用语句

    #oracle 存储过程调用语句declare v_custName varchar2(10); --客户姓名 v_num number; --订单分布天数 v_time number; --每日订单 ...

随机推荐

  1. for循环中一个不容小觑的问题

    for(int i=1;i<=100;i++) 作为程序猿,我们很喜欢使用这种for循环. 可是,当中隐含着一个重要的问题. 过多的编程经历可能使我们的思维产生了一些误解,在上面的for循环中, ...

  2. Jquery清除:hover事件

    $("#hover_div").unbind("mouseenter").unbind("mouseleave"); 可用于div按钮,造成 ...

  3. scu - 3254 - Rain and Fgj(最小点权割)

    题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...

  4. 用数组array代替CActiveRecord构建CArrayDataProvider

    当需要构建 GridView的时候: 常常用 CArrayDataProvider 或者 CActiveDataProvider 这是就需要一个CActiveRecord 比如:  857       ...

  5. DRY

    DRY(Don't Repeat Yourself )原则   凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类 ...

  6. An Overview of Complex Event Processing2

    An Overview of Complex Event Processing 翻译前言:感觉作者有点夸夸其谈兼絮絮叨叨,但文章还是很有用的.原文<An Overview of Complex ...

  7. WPF MediaElement播放器2

    在此问个问题,MediaElement播放本地和http上的视频没问题,但是ftp的怎么在本例中播放不了 若高手了解,请不吝赐教 using System; using System.Collecti ...

  8. SoccerLeagueDB

    create table if not exists League ( lid int primary key auto_increment,      lyear int not null,   s ...

  9. lua简洁的功能(两)

    Lua中的函数带有词法定界的第一类值. 第一类值: 在Lua中,函数和其它值(数值,字符串)一样,函数能够被存放在变量中,也存放在表中, 能够作为函数的參数,还能够作为函数的返回值. 词法定界:被嵌套 ...

  10. java.lang.RuntimeException: Method called after release()

    主要引起是因為在 camera.stopPreview();   camera.release(); 前沒有將setPreviewCallback 設置為null, 解決情況: public void ...