委托

  可以认为委托是一个持有多个方法的对象,当然正常情况下你不会"执行"一个对象,但是委托和典型的类型不同。可以执行委托,这时候委托变量执行它所持有的"方法"。

/// <summary>
/// 声明委托类型
/// </summary>
/// <param name="value"></param>
delegate void MyDel(int value);
static void Main(string[] args)
{
    // 声明委托变量
    MyDel myDel;
    Program program = new Program();
    Random random = new Random();
    int randomValue = random.Next(99);
    if (randomValue > 50)
    {
        // 给委托变量赋值
        myDel = new MyDel(program.PrintLow);
    }
    else
    {
        myDel = new MyDel(program.PrintHigh);
    }
    // 调用委托变量中的方法
    myDel(randomValue);
    Console.ReadKey();
}

// 委托最大的好处就是可以将方法当作参数传入,这样做的好处就是?
void PrintLow(int value)
{
    Console.WriteLine($"{value}长度");
}

void PrintHigh(int value)
{
    Console.WriteLine($"{value} 宽度");
}

使用委托:

1.声明委托类型
2.声明委托类型变量
3.创建委托类型的对象,把值赋值给委托变量。新委托对象包括某个方法的引用
4.为委托对象增加其他方法,方法必须满足委托相同的签名和返回类型 ,,
5.在代码中调用委托
可以把委托变量当作一个包含多个方法列表的变量

组合委托:

/// <summary>
/// 声明委托类型
/// </summary>
/// <param name="value"></param>
delegate void MyDel(int value);
static void Main(string[] args)
{
    // 声明委托变量
    MyDel myDel1, myDel2, myDel3;

    Program program = new Program();
    Random random = new Random();
    int randomValue = random.Next(99);
    myDel1 = program.PrintLow;

    myDel2 = program.PrintHigh;
    myDel3 = myDel1 + myDel2;
    // 调用委托变量中的方法
    myDel3(randomValue);
    Console.ReadKey();
}

void PrintLow(int value)
{
    Console.WriteLine($"{value}长度");
}

void PrintHigh(int value)
{
    Console.WriteLine($"{value} 宽度");
}

打印:

54长度
54 宽度

名字看上去是想委托被改变了一样但是委托是恒定的没有被改变

为委托添加方法使用+=

为委托删除方法使用-=

使用+=和-=符号是重新创建了一个委托变量把值赋值给委托变量

示例:

        /// <summary>
        /// 声明委托类型
        /// </summary>
        /// <param name="value"></param>
        delegate void PrintFunction();
        static void Main(string[] args)
        {
    Test t = new Test();
    PrintFunction pf;
    pf = t.Print1;
    pf += Test.Print2;
    pf += t.Print1;
    pf += Test.Print2;
    if (pf != null)
    {
        pf();
    }
    else
    {
        Console.WriteLine("委托变量是空的");
    }
    Console.ReadKey();
}

class Test
{
    public void Print1()
    {
        Console.WriteLine("我是方法Print1");
    }
    public static void Print2()
    {
        Console.WriteLine("我是方法Print2");
    }
}

打印结果:

我是方法Print1
我是方法Print2
我是方法Print1
我是方法Print2

 顺序执行方法

如果委托是带有返回值的,那么它将接受最后一个方法的返回值

/// <summary>
/// 声明委托类型
/// </summary>
/// <param name="value"></param>
delegate int  AddFunction();
static void Main(string[] args)
{
    AddFunction addFunction ;
    Test t = new Test();
    addFunction = t.Add1;
    addFunction += t.Add2;
    int result =  addFunction();
    Console.WriteLine(result);//3
    Console.ReadKey();
}

class Test
{
    int value = 1;
    public int Add1()
    {
        return value + 1;
    }
    public   int Add2()
    {
        return value + 2;
    }
}

调用带引用(ref)参数的委托,在读题部分委托列表的下一个方法时,参数值不是初始值而是传递给下一个参数。

知识点:

委托类型是引用类型,所以委托类型的变量和类变量一样保存对象的一个引用。
在创建委托类型的时候方法就有些想一个对象一样。
委托变量保存这个方法对象的引用并可以去使用他; 给委托变量重新赋值
就相当于更改了委托变量的引用

posted @ 2019-09-28 10:34  向往的人生  阅读(248)  评论(0编辑  收藏  举报