
рдЕрдЧрд▓реА рдХрдХреНрд╖рд╛ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ ifs рдФрд░ рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓рдбрд╝рдХрд┐рдпрд╛рдВ рдЦреБрд╢реА рд╕реЗ рдХрд░рд╛рд╣реЗрдВрдЧреА рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдкрдирд╛ рдлреЛрди рдирдВрдмрд░ рдЫреЛрдбрд╝ рджреЗрдВрдЧреАред рдЕрд╣рдо ... рдХреБрдЫ рдореИрдВ рд▓реЗ рдЧрдпрд╛ред
рддреЛ рдпрд╣ C # рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реНрдХ рд╣реИ:
public double PerformOperation(string op, double x, double y)
{
switch (op)
{
case "+": return x + y;
case "-": return x - y;
case "*": return x * y;
case "/": return x / y;
default: throw new ArgumentException(string.Format("Operation {0} is invalid", op), "op");
}
}
, :
?:
switch (op)
{
case "+": return this.DoAddition(x, y);
case "-": return this.DoSubtraction(x, y);
case "*": return this.DoMultiplication(x, y);
case "/": return this.DoDivision(x, y);
default: throw new ArgumentException(string.Format("Operation {0} is invalid", op), "op");
}
...
private double DoDivision(double x, double y) { return x / y; }
private double DoMultiplication(double x, double y) { return x * y; }
private double DoSubtraction(double x, double y) { return x - y; }
private double DoAddition(double x, double y) { return x + y; }
:
private delegate double OperationDelegate(double x, double y);
private Dictionary<string, OperationDelegate> _operations;
public Calculator()
{
_operations =
new Dictionary<string, OperationDelegate>
{
{ "+", this.DoAddition },
{ "-", this.DoSubtraction },
{ "*", this.DoMultiplication },
{ "/", this.DoDivision },
};
}
public double PerformOperation(string op, double x, double y)
{
if (!_operations.ContainsKey(op))
throw new ArgumentException(string.Format("Operation {0} is invalid", op), "op");
return _operations[op](x, y);
}
? тАФ .
private delegate double OperationDelegate(double x, double y);
private Dictionary<string, OperationDelegate> _operations;
. , . double double. (+-*/) .
: .
,
{ "+", this.DoAddition }
case "+": return x + y;
C# 2.0 :
{ "+", delegate(double x, double y) { return x + y; } },
{ "-", delegate(double x, double y) { return x - y; } },
{ "*", this.DoMultiplication },
{ "/", this.DoDivision },
, .
...C# 3.0 :
private Dictionary<string, Func<double, double, double>> _operations =
new Dictionary<string, Func<double, double, double>>
{
{ "+", (x, y) => x + y },
{ "-", (x, y) => x - y },
{ "*", this.DoMultiplication },
{ "/", this.DoDivision },
};
--, тАФ !
Func<double, double, double> delegate double Delegate(double x, double y)
Func< , , >. Func , . , Func , , . ?
? PerformOperation .
public double PerformOperation(string op, double x, double y)
{
if (!_operations.ContainsKey(op))
throw new ArgumentException(string.Format("Operation {0} is invalid", op), "op");
return _operations[op](x, y);
}
operations . xml-, , .
Func<double, double, double>
.
C# , .
JavaScript
var operations = { "+": function(x, y) { return x + y; } };
-?
: C# - , . , . .
, .PerformOperation . DefineOperation Calculator:
public void DefineOperation(string op, Func<double, double, double> body)
{
if (_operations.ContainsKey(op))
throw new ArgumentException(string.Format("Operation {0} already exists", op), "op");
_operations.Add(op, body);
}
:
var calc = new Calculator();
calc.DefineOperation("mod", (x, y) => x % y);
var mod = calc.PerformOperation("mod", 3.0, 2.0);
Assert.AreEqual(1.0, mod);
PerformOperation switch.