【问题标题】:C# solving pseudocode to help understanding delegates&lambdaC#解决伪代码帮助理解delegate&lambda
【发布时间】:2014-09-23 13:32:04
【问题描述】:

我在理解 lambda、委托等方面有困难,我希望有人能给我解决问题的方法,我能够更好地理解这些。基本上,当初始化类的对象时,可以创建(或更改)方法的主体,不是吗? 有点像这样:

假设我有 1 个类:A 类,如下所示:

public class ClassA{
   int i;

   public ClassA(int number)
   {
   i = number;
   }

   public void Foo(){}
}

出于演示目的非常简约,现在我在其他地方也有静态主,我想做的事情如下:创建 ClassA 的多个对象并使其在调用 ClassA.Foo 时得到不同的结果可以确定自己,它应该如何看起来语法明智?

static void Main(string[] args)
{
    ClassA FooBlue = New ClassA(1){
                     public void Foo()
                     {
                     System.Console.WriteLine("I am a Fooranger Blue!");
                     };

    ClassA FooPink = New ClassA(2){
                     public void Foo()
                     {
                     System.Console.WriteLine("My  color is the manliest!");
                     };
    ...

所以现在当我这样做时:

    ...
    FooBlue.Foo();
    FooPink.Foo();
    System.Console.ReadLine();
}

我在控制台上得到以下输出:

"I am a Fooranger Blue!"
"My color is the manliest!"

我只是再次提到,这是一个示例,绝不是出于实践的目的,但为了让我理解这些东西,如果有人可以提供一个给出所需解决方案的答案,包括 没用的整数i。

【问题讨论】:

  • 在您发布之前花更多时间格式化您的代码。这看起来很可怕,您在发布之前很容易看到这一点。如果您对自己的问题付出努力,其他人可能更愿意付出努力来帮助您。此外,据我所知,您的代码与委托或 lambda 表达式没有任何关系。您肯定还没有包含委托或 lambda 表达式...
  • @JonSkeet 我改变了我的格式(并添加了一个小句子来澄清我到底想要什么)希望现在更好。显然它没有编译,因为它是错误的,我想知道我应该如何正确地做。
  • 这种格式对我来说仍然不正确 - 看看你的第一个代码 sn-p... 没有类声明,缩进仍然混乱。这就是你希望代码在 Visual Studio 中的样子吗?
  • @JonSkeet 对,我完全搞砸了班级声明,很抱歉还是新手。

标签: c# lambda delegates anonymous-methods


【解决方案1】:

要实现“在构造类型时提供方法的实现”的目标,您确实可以使用委托。只需在构造对象时接受一个委托,并在您希望它执行时调用它:

public class ClassA
{
    private Action action;

    public ClassA(Action action)
    {
        this.action = action;
    }
    public void Foo()
    {
        action();
    }
}

lambda 的语法不同于从类定义创建命名方法的语法:

var fooBlue = new ClassA(() => Console.WriteLine("I am a Fooranger Blue!"));

【讨论】:

  • 这有帮助,但是如果我想在 Foo() 旁边传递一个参数,或者如果 Foo() 使用 if 语句或循环会“更复杂”怎么办?
  • @user3800990 如果你有一个参数而不是关闭你的 lambda 正文中的这些参数并在那里使用它们。如果您还有更多工作要做,那么您通常应该将该代码重构为一个新的命名方法,但如果需要,您可以使用语句 lambda。
  • @user3800990:您的意思是如果您希望Foo 接受一个参数,然后将其传递给您的自定义代码?您可以使用Action<int> 或其他替代方式。老实说,我认为你在这里读一本好书会好很多……
  • 哦,我明白了,我也开始了我想做的工作。是的,我可能应该读一本书或类似的书。
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2021-07-29
相关资源
最近更新 更多