当前位置: 澳门新濠3559 > 编程 > 正文

2.澳门新濠3559如果父类中装的是子类对象,它是

时间:2019-12-08 22:39来源:编程
c#中有一种类型叫委托,它是一种引用类型。可以引用静态与非静态的方法,且这些方法的参数列表和返回值类型必须与所声明的委托一致。 Delegate 里氏转换: 委托引用的方法可以通过

c#中有一种类型叫委托,它是一种引用类型。可以引用静态与非静态的方法,且这些方法的参数列表和返回值类型必须与所声明的委托一致。

Delegate

里氏转换:

委托引用的方法可以通过BeginInvoke和EndInvoke来异步进行调用。

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名 (signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。

1.子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替;

首先呈上代码案例:

首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。

2.如果父类中装的是子类对象,那么可以将这个父类强转为子类对象;

 

其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。

foreach循环:

        //声明委托
        public delegate string MethodDel(string param);

        //定义需要被委托引用的方法
        public static string DoSth(string param) {
            string rc = "";

            try{
                //执行一些操作
            }
            catch(Exception ex){
            }

            return rc;
        }

         //-------------------------------------------------------
            MethodDel method = DoSth;

            //BeginInvoke方法被调用以后,系统会自动产生一个后台线程去异步执行DoSth方法
            IAsyncResult asyncResult = method.BeginInvoke("测试参数", null, null);

            //这里的代码不会被上面那个BeginInvoke阻塞,会被同步被调用
            //ToDo......

            //代码执行到这里就会被阻塞,且等待被BeginInvoke异步执行的方法返回,并获取返回值
            //这里不得不说明一件事,无论是被BeginInvoke异步执行方法的耗时长,还是上面的那个ToDo的耗时长,
            //反正到了EndInvoke这里,都得等待上面的代码执行完毕了,才能执行EndInvoke方法。
            //result是被委托引用DoSth方法的返回结果
            string result = method.EndInvoke(asyncResult);
            //被委托引用的方法DoSth在此已经被执行完毕!

delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。

foreach(var item in Txt)

 

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if-else和switch语句,同时使得程序具有更好的可扩展性。

{

事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托。你可以在客户代码中直接调用委托来激发委托指向的函数,而事件不可以,事件的触发只能由服务代码自己触发。也就是说在你的代码里委托你不但可以安排谁是它的调用函数,还可以直接调用它,而事件不能直接调用,只能通过某些操作触发。除此之此,事件拥有委托的所有功能,包括多播特性。

          Console.Write(item);

委托是类型,事件是对象 ,事件是封装过的委托实例。也就是说,事件是面向对象的产物,它是封装性比较典型的示例。在.net中,事件是一种特殊的委托,那他到底特殊在哪,换句话说,加上event关键字到底有什么用,我理解主要有两方面:

}

一、对于事件来讲,只能在本类型内部“触发”,外部只能“注册自己+=、注销自己-=“,委托不管在本类型内部还是外部都可以“调用”,因此如果用delegate就没法进行上面的控制,所以诞生了事件这种语法。

item:代表集合里的每一项;in后面的:要遍历的目标集合;

二、在类的外部,事件只能add、remove自己,不能赋值,即事件只能“+=”、“-=”,不能“=”,这样在一定程度上保证了event系统在一个事件触发后注册过的方法都会得到通知,而不会被一个错误的赋值把别的已经注册的方法都覆盖掉。

装箱:值类型转换为引用类型;

拆箱:引用类型转换为值类型;

前提:两者要有继承关系;


委托:是一种数据类型,像类一样(可以声明委托类型变量)

           定义委托类型,注意定义委托时是否有返回值和参数,关键是看委托里面存放的那个方法有没有返回值和参数,要保持一致。

系统自带泛型委托:

1.Action        无参数无返回值

  扩展方法:Action<int>   参数是int类型,无返回值,只要是Action都是无返回值的

2.Func<int>       表示没有参数       返回值是int;

   Func<int,string>      表示的是参数是int,返回值是string。

   只要是Func<>里面有多个类型,最后一个永远是返回值。

委托和事件的区别:

委托:可以用等号(=)来赋值,可以在外部进行调用,是一种数据类型。

事件:不可以用等号(=)来赋值,不可以在外部进行调用,不是数据类型,它修饰的是一个对象。


 ToString("X2") 为C#中的字符串格式控制符

 

X为     十六进制 

 

2为     每次都是两位数

比如   0x0A ,若没有2,就只会输出0xA 

假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A 


在使用静态构造函数的时候应该注意几点:

  1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
  
  2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。

  3、一个类只能有一个静态构造函数。

  4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。

  5、最多只运行一次。

  6、静态构造函数不可以被继承。

  7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。

 

编辑:编程 本文来源:2.澳门新濠3559如果父类中装的是子类对象,它是

关键词:

  • 上一篇:没有了
  • 下一篇:没有了