C# “Lambda表达式”=&燃气轮机&引用;

C# “Lambda表达式”=&燃气轮机&引用;,c#,lambda,C#,Lambda,我试图理解一段代码,但我不明白‘p’var是什么 public Prediction(Game kkk,bool checkit, params State[] checkStates) : base(game, p => Manager.method(kkk, p)) { this.checkit = checkit; this.checkStates = checkStates; } 第二类: public PiratePrediction(Game game

我试图理解一段代码,但我不明白‘p’var是什么

public Prediction(Game kkk,bool checkit, params State[] checkStates)
    : base(game, p => Manager.method(kkk, p))
{
    this.checkit = checkit;
    this.checkStates = checkStates;
}
第二类:

public PiratePrediction(Game game, System.Func<Pirate, T> valueExtractor)
{
    this.game = game;

    this.valueExtractor = valueExtractor;

    this.predictedValues = new Dictionary<Pirate, T>();

    this.totalPredictions = 0;
    this.correctPredictions = 0;
}
公共盗版(游戏、系统功能值提取器)
{
这个游戏=游戏;
this.valueExtractor=valueExtractor;
this.predictedValues=新字典();
该值为0;
此值为0;
}

p
是传递到方法中的参数。
Func
是一个
委托
,表示方法签名

考虑以下几点:

private class DisplayClass
{ 
    public readonly Game kkk;
    public DisplayyClass(Game kkk) { this.kkk = kkk; }
    public T handler(Pirate p) { return Manager.method(kkk, p); }
}

public Prediction(Game kkk,bool checkit, params State[] checkStates)
    : base(game, new DisplayClass(kkk).handler)
{
    this.checkit= checkit;
    this.checkStates = checkStates;
}
这就是编译器在解释lambdas时对代码所做的操作——最好将代码通过反编译器来查看确切的语法

在展开的代码中可以看到,
p
变量是方法中的一个参数,lambda只是传递方法的一种简写方式,然后可以在其他代码中调用这些方法

// Somewhere in the base class...
void ExtractValue(Pirate p)
{ 
    // ...
    T value = this.valueExtractor(p);
    // ...
}
这样调用时,
p
将是该其他代码传入的值,并且根据的定义,将是类型为
Pirate


请记住,传递lambda的代码可以多次调用lambda中的代码,例如。我建议不仅要阅读lambda,还要广泛使用它们在

中。lambda表达式是匿名方法的声明。想象一下:

p => Manager.method(kkk, p)
等于:

private T SomeMethod<T>(Pirate p)
{
    return Manager.method(kkk, p);
}
private T SomeMethod(Pirate p)
{
返回管理器方法(kkk,p);
}

但是,在您的情况下,您将无法执行第二个代码段,因为
kkk
是lambda表达式声明范围内的局部变量,这意味着lambda可以使用
kkk
,而显式方法声明则不能(请参阅)。这只是lambdas优于声明方法的一个优点。

找到了您正在使用的类

valueExtractor
lambda来自
Update
,而
p
来自
predictedValues
字典的键

 public virtual void Update()
 {
       foreach (var pair in this.predictedValues)
       {
          if (pair.Key.State != PirateState.Lost && !EqualityComparer<T>.Default.Equals(pair.Value, default(T)))
           {
                this.totalPredictions++;
                if (this.valueExtractor(pair.Key).Equals(pair.Value))
                    this.correctPredictions++;
            }
        }
        this.predictedValues.Clear();
    }

它是传递给匿名方法的参数。我们也不知道,因为您没有发布被调用的基类的构造函数。@Abion47如何检测匿名方法?@Sagi Define“detect”。我爱您。谢谢你,伙计!
    public T Predict(Pirate p)
    {
        if (this.predictedValues.ContainsKey(p))
            return this.predictedValues[p];
        T predictedValue = this.predict(p);
        if (EqualityComparer<T>.Default.Equals(predictedValue, default(T)))
            return default(T);
        this.predictedValues.Add(p, predictedValue);
        return predictedValue;
    }