C# 学习记录-泛型,委托

版权声明:本人菜鸟一只,如文章有错误或您有高见,请不吝赐教 https://blog.csdn.net/qq_41138935/article/details/82803957

【协变和抗变】

,NET4通过协变和抗变为泛型接口和泛型委托添加了一个 重要的扩展。协变和抗变指对参数和返回值的类型进行转换。例如,可以给一个需要shape参数的 方法传送Recaglc参数码?下面用示例说明这些扩展的优点。

协变<<

如果泛型类型用 out 关键字标注,泛型接口就是协变的。这意味着返回类型只能是T。

抗变<<

如果泛型类型用 in 关键字标注,泛型接口就是抗变的。接口只能把泛型类型T用作其方法的输入。

【泛型结构】

泛型结构没有继承的特性。

【委托】

简单委托实例:

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

namespace ConsoleApp4
{
    class MathOperations
    {
        public static double MultiplyByTwo(double value)
        {
            return value * 2;
        }
        public static double Square(double value)
        {
            return value * value;
        }
    }
    delegate double DoubleOp(double x);
    class Program
    {
        static void Main(string[] args)
        {
            DoubleOp[] operations = {
                MathOperations.MultiplyByTwo,
                MathOperations.Square
            };
            for(int i = 0; i < operations.Length; i++)
            {
                Console.WriteLine("Using operation[{0}]",i);
                ProcessAndDisplayNumber(operations[i],2.0);
                ProcessAndDisplayNumber(operations[i], 7.94);
                ProcessAndDisplayNumber(operations[i],1.414);
                Console.WriteLine();

            }
            Console.ReadKey();
        }
        static void ProcessAndDisplayNumber(DoubleOp action,double value)
        {
            double result = action(value);
            Console.WriteLine("Value is {0},result of operation is {1}",value,result);
        }
    }
}

泛型Action<T>委托表示引用一个void返回类型的方法。因为这个委托类存在不同的变体,所以可 以传递至多16种不同的参数类型。没有泛型参数的Action类可调用没有参数的方法。Action<in T>调用带一个参数的方法,Action<in T1,in T2>调 用带两个参数的方法,Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7, in T8>调用带8个参数的方法。

Func<T>委托可以以类似的方式使用。 Func<T>允许调用带返回类型的方法。 与Action类似 , Func<T>也定义了不同的变体,至多也可以传递16个参数类犁和一个返回类型。Func<in T,out TResult> 委托类型可以调用带返回类型且无参数的方法,Func<in T,out TResult>调 用带一个参数的方法 , Func<in T1,in T2 , in T3 ,in T4 , out TResult> 调用带4个参数的方法。 

匿名方法<<

匿名方法是用作委托的参数的一段代码。(委托的参数不是方法签名是代码)

规则:匿名方法中不能使用跳转语句(break,goto,continue)跳到匿名方法的外部,同样外部也不能跳到内部。

匿名方法内部不能访问不安全的代码,也不能访问在匿名方法外部使用的ref,out参数。

猜你喜欢

转载自blog.csdn.net/qq_41138935/article/details/82803957