Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 授权它如何工作_C#_Visual Studio 2012_Delegates - Fatal编程技术网

C# 授权它如何工作

C# 授权它如何工作,c#,visual-studio-2012,delegates,C#,Visual Studio 2012,Delegates,使用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 simpl

使用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;
    }
    }
}
结果我得到了下一个

那么问题-为什么委派
MyDelegate
不起作用以及通用变量-起作用?我错了

还有另一个问题——我可以将显示的示例方法称为类似这样的方法

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

使用代理有什么好处?或者它只是一个变体,我如何使用委托和“完全权限”,我可以看到什么时候可以尝试使用lamba扩展和事件?(刚刚来到本章-尚未阅读-如何更好地理解委托)。

要回答您的第一个问题,您的委托不起作用,因为您从未调用过它。您刚刚在此处创建了它的一个实例:

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);
private void Repeat(MyDelegate方法,整数倍)
{
for(int i=0;i

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

问题是您从未调用
myD
委托。使用
MyDelegate
更容易忽略这一点,因为您没有向其中传递任何内容或获取任何返回值

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

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

您没有在任何地方调用
myD
。试试这个:
myD()委托的优点是您可以将任何有效函数传递给它。这意味着您可以非常轻松地扩展和更改类或方法的行为。缺点是很难调试,而且(从我的角度来看)如果不小心使用会使代码无法阅读。谢谢,正如@p.s.w.g所写的那样-你也是对的…也许还有关于第二个问题的评论吗?@Kirill我刚刚添加了关于第二个问题的第二段。还没有阅读关于event和LINQ的文章,好吧,如果我后来读到它的时候我就明白了——好吧,那么想想这种用法——对delegatesoh来说只是简单的用法,现在我终于明白了!两个半晚上给我一些结果!!!谢谢你的解释!!!还发现我可以像
Repeat(myD,5)一样调用它
@Kirill正确,您可以直接使用委托变量,也可以引用方法本身,该方法将方法隐式转换为委托变量,以传递给
Repeat
@Kirill您也可以使用,例如
Repeat(()=>Console.WriteLine(“Lambda”),5)
需要多一点时间来阅读和尝试lambda函数-但正如我现在看到的-它提供了很多紧凑的代码,我认为(由于缺乏知识,我现在看不到)提供了额外的编码功能,但仍然需要大量阅读和实践。。。
MyDelegate myD;
myD = new MyDelegate(TestMethod);
myD(); // executes TestMethod