我已经快速阅读了Microsoft Lambda Expression文档.
这种例子帮助我更好地理解了:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
Run Code Online (Sandbox Code Playgroud)
不过,我不明白为什么会有这样的创新.它只是一种在"方法变量"结束时死亡的方法,对吗?为什么我应该使用它而不是真正的方法?
我在C#中编写了一个函数来进行数值微分.它看起来像这样:
public double Diff(double x)
{
double h = 0.0000001;
return (Function(x + h) - Function(x)) / h;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够传递任何功能,如:
public double Diff(double x, function f)
{
double h = 0.0000001;
return (f(x + h) - f(x)) / h;
}
Run Code Online (Sandbox Code Playgroud)
我认为这对代表来说是可能的(也许?)但是我不确定如何使用它们.
任何帮助将不胜感激.
遵循这个问题 - 使用C#传递方法作为参数和我的一些个人经验我想更多地了解调用委托与仅在C#中调用方法的性能.
虽然代表非常方便,但我有一个应用程序通过委托做了很多回调,当我们重写这个使用回调接口时,我们得到了一个数量级的速度提升.这是使用.NET 2.0所以我不确定3和4的情况如何变化.
如何在编译器/ CLR内部处理对委托的调用,这对方法调用的性能有何影响?
编辑 - 澄清代表与回调接口的含义.
对于异步调用,我的类可以提供一个OnComplete事件和调用者可以订阅的相关委托.
或者,我可以使用调用者实现的OnComplete方法创建一个ICallback接口,然后将其自身注册到类,然后在完成时调用该方法(即Java处理这些事情的方式).
我需要一种在c#中定义方法的方法,如下所示:
public String myMethod(Function f1,Function f2)
{
//code
}
Run Code Online (Sandbox Code Playgroud)
设f1为:
public String f1(String s1, String s2)
{
//code
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我有一个在发生异常时调用的方法:
public void ErrorDBConcurrency(DBConcurrencyException e)
{
MessageBox.Show("You must refresh the datasource");
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是将此函数传递给方法,因此如果用户单击是,则调用该方法,例如
public void ErrorDBConcurrency(DBConcurrencyException e, something Method)
{
if (MessageBox.Show("You must refresh the datasource") == DialogResult.OK)
Method();
}
Run Code Online (Sandbox Code Playgroud)
方法可能有也可能没有参数,如果是这种情况我也想传递它们.
我怎么能做到这一点?
我希望能够将方法作为参数传递.
例如..
//really dodgy code
public void PassMeAMethod(string text, Method method)
{
DoSomething(text);
// call the method
//method1();
Foo();
}
public void methodA()
{
//Do stuff
}
public void methodB()
{
//Do stuff
}
public void Test()
{
PassMeAMethod("calling methodA", methodA)
PassMeAMethod("calling methodB", methodB)
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我有一个类 ( Biome),其中包含自定义对象 ( Level)的二维数组。我经常想遍历所有(或部分)级别并执行一些操作,例如设置它们的颜色属性。
与其一遍又一遍地编写相同的嵌套 for 循环,我可以制作自己的方法来让我做类似的事情:ForEachLevel(SetColour())?SetColour()我的Biome类中哪里有一个方法,它只是将 Level 的颜色属性设置为某个随机值或使用基于Biome.
所以而不是:
for (int r = 0; d < Rows; r++)
{
for (int c = 0; l < Cols; c++)
{
if (some logic here)
Levels[r, c].Colour = Color.Red;
else
Levels[r, c].Colour = Color.Green;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以做这样的事情:
ForEachLevel(SetColour(--what goes here?--));
void SetColour(Level level){
if (some logic here)
level.Colour = Color.Red;
else
level.Colour = Color.Green;
}
Run Code Online (Sandbox Code Playgroud)
或者更好的是,我想做一些类似的东西,它只在 X 行到 Y 行上运行一个函数。 …
我正在使用 C# 中的一个库,其中的方法要求我将目标方法的字符串名称作为参数传递。
出于显而易见的原因,我想避免使用硬编码字符串,因此我将编写一个中间 util 方法,该方法采用一个方法,获取名称(大概通过反射)并将其输入到库方法中。
我希望中间方法看起来像这样:
public void CallOtherMethod(???? inputMethod)
{
string methodName = inputMethod.Name; // This gives me the method without the namespace, right?
this.CallFinalMethod(methodName);
}
Run Code Online (Sandbox Code Playgroud)
像这样调用:
this.CallOtherMethod(this.SomeOtherMethod);
Run Code Online (Sandbox Code Playgroud)
但是,我在确定执行此操作所需的类型时遇到了一些麻烦。
我怎样才能正确定义我的方法?
作为旁注,我很乐意将其编写为库的扩展方法,但这不太适合库的行为方式。
我有一个接受Action委托并执行给定方法的方法,如下所示:
public void ExpMethod(Action inputDel)
{
inpuDel();
}
Run Code Online (Sandbox Code Playgroud)
我可以这样调用上面给出的方法:
ExpMethod(() => {/*do something that matters*/});
Run Code Online (Sandbox Code Playgroud)
一切正常.到现在为止还挺好.现在我想要一个将泛型Action委托作为输入参数的方法 - 像这样:
public void ExpGenMethod(Action<string,int> inputDel)
{
// I don't know how to call the supplied delegate as it requires parameters
}
Run Code Online (Sandbox Code Playgroud)
另外,我试图ExpGenMethod用这种方式调用它:
ExpGenMethod(("Hi",1) => {/*do something that makes sense*/});
Run Code Online (Sandbox Code Playgroud)
但它显示语法错误.在这种情况下,请告诉我如何使用通用操作委托?
让我们说我有一个方法
public static void Blah(object MyMethod) { // i dont know what to replace object with
MyMethod; // or however you would use the variable
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我需要能够通过变量引用一个方法