C#是否支持绑定方法或方法闭包(允许它始终指向实例的特殊闭包)

C#是否支持绑定方法或方法闭包(允许它始终指向实例的特殊闭包),c#,C#,Adobe有一个非常清楚的解释: 绑定方法(有时称为方法闭包)是从其实例中提取的方法。绑定方法的示例包括作为参数传递给函数或作为值从函数返回的方法。绑定方法类似于函数闭包,因为即使从实例中提取,它仍保留其词法环境。然而,绑定方法和函数闭包之间的关键区别在于,绑定方法的此引用仍然链接或绑定到实现该方法的实例。换句话说,绑定方法中的此引用始终指向实现该方法的原始对象。对于函数闭包,this引用是泛型的,这意味着它指向调用函数时与之关联的任何对象 如果C#支持泛型闭包,有没有办法将其转换为更方便的绑定

Adobe有一个非常清楚的解释:

绑定方法(有时称为方法闭包)是从其实例中提取的方法。绑定方法的示例包括作为参数传递给函数或作为值从函数返回的方法。绑定方法类似于函数闭包,因为即使从实例中提取,它仍保留其词法环境。然而,绑定方法和函数闭包之间的关键区别在于,绑定方法的此引用仍然链接或绑定到实现该方法的实例。换句话说,绑定方法中的此引用始终指向实现该方法的原始对象。对于函数闭包,this引用是泛型的,这意味着它指向调用函数时与之关联的任何对象


如果C#支持泛型闭包,有没有办法将其转换为更方便的绑定方法,因为不能使用此方法而人为地使用sender是非常烦人和不真实的,最重要的是必须明确地传递sender对象,而不能使用隐式this关键字。

是的,根据该定义,C#支持“绑定方法”


说实例方法和lambda听起来有点冗长。也许对我来说,这是我第一次读到对闭包应用于现实世界的清晰解释:)我不同意你说的实例方法:它不仅仅是关于琐碎的实例方法:它是关于this关键字上下文,而不是关于实例方法。谢谢,我会先试试,因为我对所有这些东西都不熟悉,所以我看不到这个关键字在您的示例中的任何用法:)this的用法是隐式的。我们可以在
greet
方法
中显式使用它,返回this.prefix+“”+who,但这是不必要的。通常,唯一明确使用
的时间是您有一个隐藏同名成员的本地文件。例如,
类X{intm=0;void setm(intm){this.m=m;}}
class Greeter
{
   public string prefix { get; set; }

   public string greet(string who)
   {
      return prefix + " " + who;
   }
}

class Program
{
   public static void doit(Func<string, string> a)
   {
      Console.Out.WriteLine(a("World"));
   }

   static void Main(string[] args)
   {
      // pass doit a Greeter method bound to instance foo
      Greeter foo = new Greeter() { prefix = "Hello" };
      doit(foo.greet);

      // pass doit a Greeter method bound to instance bar
      Greeter bar = new Greeter() { prefix = "Bonjour" };
      doit(bar.greet);

      // pass doit a closure bound to the local variable prefix
      string prefix = "Goodbye";
      doit(( who) => prefix + " " + who );
   }
}
Hello World
Bonjour World
Goodbye World