我正在创建一个像项目一样的计算器,它需要对变量执行操作+, -, *, /, %, ^
。标准操作属于var1 OP var2
类型。我在运行时有两个变量的类型,可以是Int64
或double
。
我可以将它们都转换为double并进行计算,但是当两个变量都是整数时,我更倾向于进行基于整数的计算(否则将两者都转换为double)。这是我到目前为止(添加)
if (container1.vType == Interop.variableType.DOUBLE || container2.vType == Interop.variableType.DOUBLE)
return Convert.ToDouble(container1.value) + Convert.ToDouble(container2.value);
return (Int64)container1.value + (Int64)container2.value;
但是,由于多次操作,反复使用相同/相似的代码会产生不必要的冗余(我只需要更改运算符)。
那么我应该如何做到这一点,以便它具有高性能和最小/无冗余?
答案 0 :(得分:2)
这是另一种方法。它减少了代码重复,但增加了LOC。它肯定比直接调用运算符效率低。这样做的主要好处是可扩展性和模块化,可以长期维护。
class Evaluator {
Dictionary<string, Func<dynamic, dynamic, dynamic>> BinaryOperatorsDyn = new Dictionary<string, Func<dynamic, dynamic, dynamic>>();
public Evaluator() {
LoadOperators();
}
void LoadOperators() {
BinaryOperatorsDyn.Add("+", (x, y) => x + y);
BinaryOperatorsDyn.Add("-", (x, y) => x - y);
BinaryOperatorsDyn.Add("*", (x, y) => x * y);
}
public void DoDemo() {
long x = 20;
double y = 30;
var oper = "+";
var result = BinaryOperatorsDyn[oper](x, y);
Console.WriteLine($"Result of {x} + {y} is {result}. Type of result is {result.GetType().ToString()}");
}
}
class Program {
static void Main(string[] args) {
var eval = new Evaluator();
eval.DoDemo();
}
}