2

使用 C#、.Net Framework 4.5、Visual Studio 2012

经过一些理论尝试在 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");
    }
}
}

结果得到了下一个

我的结果

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

还有另一个问题- 我可以调用显示的示例方法,例如

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

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

4

2 回答 2

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知道在编译时需要调用哪个方法。这个想法是一些编程技术的核心(参见函数式编程)。您可能已经熟悉的一个大项目是Linq,它使用委托以一种高效而优雅的方式操作集合。

于 2013-11-14T20:23:17.427 回答
1

问题是您从不调用myD委托。这更容易错过,MyDelegate因为您没有向其中传递任何内容或获取任何返回值。

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

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

于 2013-11-14T20:23:38.180 回答