gpt4 book ai didi

c# - 为什么委托(delegate)可以互换用于类方法和静态函数?

转载 作者:行者123 更新时间:2023-11-30 14:42:04 30 4
gpt4 key购买 nike

我使用委托(delegate)已经很多年了,但并没有真正考虑过它们。但最近我很生气,因为我假设委托(delegate)在引用类方法时存储了一个 this 引用。下面的例子说明了我的理解上的差距。

public class SomeClass
{
public SomeClass(int someProperty)
{
SomeProperty = someProperty;
}

public int SomeProperty
{
get;
set;
}

// Throw in a Member field into the mix
public int ClassAdd(int x, int y)
{
return x + y + SomeProperty;
}
}

public static class SomeStaticClass
{
public static int StaticAdd(int x, int y)
{
return x + y;
}
}

为什么我可以同时添加静态订阅者和实例订阅者?

class TestClass
{
delegate int myAddDelegate(int x, int y);

private void UseDelegates()
{
myAddDelegate algorithm;
algorithm = new SomeClass(3).ClassAdd;
// Surprised that I could add static methods to my delegate?
algorithm += SomeStaticClass.StaticAdd;

// I'm fine with just one of the results being returned.
int answer = algorithm(5, 10);
}
}

到底发生了什么? ;)

最佳答案

如果您创建引用实例方法的委托(delegate),它将在支持Target的字段中捕获this(或相关引用)。委托(delegate)的属性(property)。如果您创建引用静态方法的委托(delegate),则 Target 将为 null。从逻辑上讲,如果您使用静态方法,则不需要实例。

作为一个额外的复杂性,您可以捕获扩展方法,就好像它们是扩展类型上的实例方法一样:

static class Extensions
{
public static void Foo(this string x)
{
Console.WriteLine("Calling Foo on " + x);
}
}

class Test
{
static void Main()
{
Action action = "text".Foo;
Console.WriteLine(action.Target); // Prints "text"
}
}

至于为什么您可以执行所有这些操作:因为它很有用,并且没有理由不允许允许您执行此操作:)

关于c# - 为什么委托(delegate)可以互换用于类方法和静态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3447337/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com