在C#中使用委托
在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.为什么?
原因如下:
您声明委托的方式直接指向静态int实例的ToString
方法。 它在创build时被捕获。
正如弗林德伯格在下面的评论中指出的那样,每个代表都有一个目标和一个要在目标上执行的方法。
在这种情况下,要执行的方法显然是ToString
方法。 有趣的部分是方法执行的实例:它是创build时的I
实例,这意味着委托不使用I
来获取实例,而是存储对实例本身的引用。
稍后,您将I
更改为一个不同的值,基本上分配给它一个新的实例。 这不会奇迹般地改变你的委托中捕获的实例,为什么呢?
为了得到你期望的结果,你需要改变这个委托:
static Func<string> del = new Func<string>(() => I.ToString());
像这样,委托指向执行委托时在当前I
上执行ToString
的匿名方法。
在这种情况下,要执行的方法是在声明委托的类中创build的匿名方法。由于实例是静态方法,因此该实例为null。
查看编译器为委托的第二个版本生成的代码:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0); private static string cctor>b__0() { return UserQuery.I.ToString(); }
正如你所看到的,这是一个正常的方法。 在我们的例子中,它返回I
的当前实例的调用ToString
的结果。
您需要将I
传递给您的函数,以便可以在适当的时间(而不是在创build函数时I.ToString()
执行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)); } }
这是应该如何做的:
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()); } } }
C#委托启用封装对象,实例和方法。 委托声明定义了从类System.Delegate派生的类。 委托实例封装了一个调用列表,这个列表是一个或多个方法的列表,每个方法都被称为可调用实体。
学习更多的forms
http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html
我的猜测是因为int通过值而不是引用传递,因此在创build委托时,它是当前值“I”(0)的方法ToString的委托。