委派它是如何工作的

时间:2013-11-14 20:19:40

标签: c# visual-studio-2012 delegates

使用C#,。Net Framework 4.5,visual Studio 2012

一些theory尝试在C#中创建一些委托。

目前创建下一个代码

namespace SimpleCSharpApp
{
public delegate void MyDelegate();
class Program
{   
    private static string name;
    static void Main(string[] args)
    {
        //my simple delegate
        Console.WriteLine("Enter your name");
        name = Console.ReadLine().ToString();
        MyDelegate myD;
        myD = new MyDelegate(TestMethod);

        //Generic delegate
        Func<Int32, Int32, Int32> myDel = new Func<Int32, Int32, Int32>(Add);
        Int32 sum = myDel(12, 33);
        Console.WriteLine(sum);
        Console.ReadLine();

        //call static method from another class
        myD = new MyDelegate(NewOne.Hello);
    }
    public static void TestMethod()
    {
        Console.WriteLine("Hello {0}", name);
    }
    public static Int32 Add(Int32 a, Int32 b)
    {
        return a + b;
    }
    }
}

和花药班

namespace SimpleCSharpApp
{
 sealed class NewOne
{
    static public void Hello()
    {
        Console.WriteLine("I'm method from another class");
    }
}
}

结果得到了下一个

My result

所以问题 - 为什么委托MyDelegate不起作用和通用变体 - 工作?哪里我错了。

另一个问题 - 我可以调用这样的显示样本方法

        //calling method
        Console.WriteLine("Enter your name");
        name = Console.ReadLine().ToString();
        TestMethod();
        //from another class
        NewOne.Hello();

我在使用代表时获得的优势是什么?或者它只是一个变种我如何使用委托和“全功率”我可以看到何时可以尝试lamba扩展和事件? (刚刚进入本章 - 尚未阅读 - 想要更好地理解代表)。

2 个答案:

答案 0 :(得分:5)

要回答您的第一个问题,您的代表无法工作,因为您从未调用它。你刚刚在这里创建了一个实例:

MyDelegate myD;
myD = new MyDelegate(TestMethod);

但是你的程序中没有任何地方实际调用myD。试着这样称呼:

MyDelegate myD;
myD = new MyDelegate(TestMethod);
myD();

要回答第二个问题,使用委托的主要优点是您可以在不立即调用方法的情况下引用方法。例如,假设您要将方法传递给另一个函数以进行其他处理:

private void Repeat(MyDelegate method, int times)
{
    for (int i = 0; i < times; i++)
        method();
}

Repeat(NewOne.Hello, 5);

您允许Repeat方法控制调用NewOne.Hello的方式和时间,而不需要Repeat知道在编译时需要调用哪个方法。这个想法是一些编程技术的核心(见Functional Programming)。您可能已经熟悉的一个重要问题是Linq,它使用委托以高效和优雅的方式操作集合。

答案 1 :(得分:1)

问题是你永远不会调用myD代表。使用MyDelegate更容易错过,因为您没有传递任何内容或获取任何返回值。

MyDelegate myD;
myD = new MyDelegate(TestMethod);
myD(); // executes TestMethod

对于第二个问题,简短版本是委托主要用于事件处理程序和LINQ(以及类似方法)。