C# 枚举运算符
只是出于好奇,问这个 就像下面的表达C# 枚举运算符,c#,enums,operators,ternary-operator,C#,Enums,Operators,Ternary Operator,只是出于好奇,问这个 就像下面的表达 a = (condition) ? x : y; // two outputs 为什么我们不能有一个枚举运算符 说 而不是switch语句(即使重构是可能的) 还是某种无用的算子?< /P> < P> C?借用C++的语法,C++从C中借用语法,C没有一个< > >?::/Cuth>运算符,因为K&R可能不觉得有必要。它不是一个“无用的操作符”,但它会被认为是语法上的糖 此外,运算符依赖枚举声明中常量的特定顺序不是一个好主意。条件的计算结果为true或
a = (condition) ? x : y; // two outputs
为什么我们不能有一个枚举运算符说 而不是switch语句(即使重构是可能的)
还是某种无用的算子?< /P> < P> C?借用C++的语法,C++从C中借用语法,C没有一个< > >?::/Cuth>运算符,因为K&R可能不觉得有必要。它不是一个“无用的操作符”,但它会被认为是语法上的糖
此外,运算符依赖枚举声明中常量的特定顺序不是一个好主意。条件的计算结果为true或false。您不存在的运算符的建议算法是什么?很难说它是否有用,但switch case可以满足您的需要。我不能说我曾经想要过这样一个运算符——依赖于枚举值的顺序,它会非常脆弱。您可以轻松使用开关:
switch (f)
{
case Fruit.Apple: myValue = fnApple(); break;
case Fruit.Mango: myValue = fnMango(); break;
case Fruit.Orange: myValue = fnOrange(); break;
default: throw new ArgumentOutOfRangeException("f");
}
或者,创建地图:
static readonly Dictionary<Fruit, Func<Foo>> FruitFunctions =
new Dictionary<Fruit, Func<Foo>> {
{ Fruit.Apple, fnApple },
{ Fruit.Mango, fnMango },
{ Fruit.Orange, fnOrange }
};
...
myValue = FruitFunctions[f]();
静态只读字典函数=
新词典{
{水果,苹果,苹果},
{水果,芒果,芒果},
{水果,橘子,橘子}
};
...
myValue=子函数[f]();
我在各种情况下都使用了这两种技术,恐怕我更喜欢它们而不是建议的操作员。我可以马上想到三个原因:
主要的问题——除了它不安全、不必要,而且在大多数实际情况下可能无法阅读之外——是它促进了一种编程模型,而现在大多数人都认为这种编程模型不好 大多数语言都有自己允许的和想要推广的编程/设计风格。C#允许命令式和过程式编程,但促进了面向对象技术的使用。您的操作符属于第一阵营,而不是语言设计者想要支持的东西 如果您确实希望以这种方式编程,则可以使用:
myValue = (f == Fruit.apple) ? fnApple()
: (f == Fruit.mango) ? fnMango()
: fnOrange();
C和C++没有操作符本身不是一个好的原因——它们既没有lambda表达式也没有空凝聚算子。还有其他更好的理由,比如你最后一句话中的理由。更重要的是,没有什么好的理由让我这么做。我不明白你的第一个问题。你能换个说法吗?为什么我们不能依赖他们的订单呢?@Veer你可以稍后添加一个,然后你就必须更改你使用该软件的所有位置???操作人员对于地图,您只需要在一个地方修改它。@Veer:两点-首先,顺序在使用点不可见,因此很难阅读。其次,枚举声明中看似无辜的更改将完全改变代码的含义。@Veer:我会说,当一个运算符脆弱或缺乏可读性的辩护是“你不会经常使用它”时,这就说明了一切;)@Veer:当一个运算符如此脆弱时,C#team不将其包含在语言中,这无疑是一个标志。附加值不高。相反,还有一种射自己脚的方法。我认为这除了混淆之外没有什么意义。(基于布尔表达式选择结果似乎很多,但对于枚举则不是。)
static readonly Dictionary<Fruit, Func<Foo>> FruitFunctions =
new Dictionary<Fruit, Func<Foo>> {
{ Fruit.Apple, fnApple },
{ Fruit.Mango, fnMango },
{ Fruit.Orange, fnOrange }
};
...
myValue = FruitFunctions[f]();
myValue = (f == Fruit.apple) ? fnApple()
: (f == Fruit.mango) ? fnMango()
: fnOrange();