我有以下内容:
Calculator cl = new Calculator();
我有一个带有方法的类:
public class Testing {
public void Calc(int x) {
}
}
我想将一个计算器委托给 Calc 方法,以便它可以在 Calc 中使用。
这有意义吗?我怎样才能做到这一点?
我有以下内容:
Calculator cl = new Calculator();
我有一个带有方法的类:
public class Testing {
public void Calc(int x) {
}
}
我想将一个计算器委托给 Calc 方法,以便它可以在 Calc 中使用。
这有意义吗?我怎样才能做到这一点?
很难说你到底在问什么。但是,如果该类表示该类打算使用Calculator
的某种“服务” ,那么常见的方法是使用一个字段:Testing
public class Testing
{
private readonly Calculator calculator = new Calculator();
public void Calc(int x)
{
// use calculator here
}
}
如果Calculator
实际上是可配置的,或者类似的东西,并且您不想在内部对其进行初始化Testing
,那么您可以将其作为构造函数参数:
public class Testing
{
private readonly Calculator calculator;
public Testing(Calculator calculator)
{
this.calculator = calculator;
}
public void Calc(int x)
{
// use calculator here
}
}
svick 的回答完全正确,更适合您描述的问题。但是由于您提到了代表,因此您可以在示例的上下文中使用以下方式:
public static class Testing
{
public static long Calc(long x, long y, Func<long, long, long> function)
{
if (function == null) throw new ArgumentNullException("function");
return function(x, y);
}
static void Main()
{
Func<long, long, long> add = delegate(long a, long b) { return a + b; };
Func<long, long, long> multiply = (a, b) => a * b;
Console.WriteLine("3+2 = {0}", Calc(3, 2, add);
Console.WriteLine("6*7 = {0}", Calc(6, 7, multiply);
Console.WriteLine("3^2 = {0}", Calc(3, 2, (a, b) => Math.Pow(a, b));
}
}
这是委托和 lambda 的一个相当愚蠢的应用,但它确实揭示了它们的威力。
您可能会发现委托类型很有用。他们避免了Func<int, int, int>
-everywhere 陷阱。如果函数的签名发生更改,则可以更轻松地修改现有代码。
您还可以使委托本身成为一个属性。
public class Testing {
// this is the signature of the method we'd like to use to calculate.
public delegate int Calculator(int a, int b);
public Calculator Calc { get; set; }
public Testing() {
this.Calc = (x, y) => {
throw new Exception("You haven't set a calculator!");
};
}
public Testing(Calculator calc) {
this.Calc = calc;
}
public int CalcWithOne(int x) {
return Calc(1, x);
}
}
然后你可以使用like
Testing test = new Testing((x, y) => x + y);
// or
Testing test = new Testing();
test.Calc = (x, y) => x + y;
// then
test.Calc(2, 3); // 5
test.CalcWithOne(7); // 8