在C#中使用委托(Using delegates in C#)

2019-08-03 06:37发布

在C#语言和.NET框架,你可以帮我了解的代表? 我试图检查一些代码,发现我收到的结果是出乎意料的我。 这里是:

class Program
{
    public static int I = 0;

    static Func<string> del = new Func<string>(I.ToString);

    static void Main(string[] args)
    {
        I = 10;
        Console.WriteLine("{0}", del());
    }
}

答案是0,但不10.为什么?

Answer 1:

其原因如下:

声明委托的方式,直接指向ToString静态INT实例的方法。 它在创建时被捕获。

如flindeberg在下面的评论所指出的,每个代表具有目标和方法要在目标执行。

在这种情况下,要执行的方法是明显的ToString方法。 有趣的是在执行方法的实例:它是实例I在创作的时候,这意味着该委托没有使用I去使用实例,但它存储参照实例本身。

后来你改变I为不同的值,基本上分配给它一个新的实例。 这并不神奇改变你的委托拍摄的情况下,又何必呢?

为了得到你所期望的结果,则需要委托改成这样:

static Func<string> del = new Func<string>(() => I.ToString());

与此类似,委托指向执行匿名方法ToString对当前I在委托执行的时间。

在这种情况下,要执行的方法是在其中委托中声明的类创建的匿名方法,该实例为null,因为它是一个静态方法。

看一看编译器生成委托的第二个版本的代码:

private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
    return UserQuery.I.ToString();
}

正如你所看到的,它是做一个正常的方法。 在我们的情况下,它调用返回的结果ToString上的当前实例I



Answer 2:

你需要通过I给你的功能,使I.ToString()可以在适当的时候(而不是在时间的函数创建)执行。

class Program
{
    public static int I = 0;

    static Func<int, string> del = num => num.ToString();

    static void Main(string[] args)
    {
        I = 10;
        Console.WriteLine("{0}", del(I));
    }
}


Answer 3:

下面是应该这样做:

using System;

namespace ConsoleApplication1
{

    class Program
    {
        public static int I = 0;

        static Func<string> del = new Func<string>(() => {
            return I.ToString();
        });

        static void Main(string[] args)
        {
            I = 10;
            Console.WriteLine("{0}", del());
        }
    }
}


Answer 4:

C#代表启用同时封装的对象和实例和方法。 甲委托声明定义了从类System.Delegate派生的类。 一个代表实例封装了一个调用列表中,这是一个列表中的一个或多个方法,其中的每一个被称为可调用实体。

了解更多形式

http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html



Answer 5:

我的猜测是因为INT由值不引用过去了,用于创建委托时的原因,这是一个授人以“I”的当前值的方法ToString(0)。



文章来源: Using delegates in C#