C# “Lambda表达式”=&燃气轮机&引用;
我试图理解一段代码,但我不明白‘p’var是什么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
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;
}