[英]operator for enums
出於好奇,問這個
就像下面的表達式一
a = (condition) ? x : y; // two outputs
為什么我們不能有一個枚舉運算符?
說,
myValue = f ??? fnApple() : fnMango() : fnOrange(); // no. of outputs specified in the enum definition
而不是switch語句(即使可以重構)
enum Fruit
{
apple,
mango,
orange
};
Fruit f = Fruit.apple;
還是某種無用的運算符?
我不能說我曾經想要過這樣的運算符-依靠枚舉值的順序將使它非常脆弱。 您可以輕松使用開關:
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]();
恐怕我在各種情況下都使用了這兩種技術,並且相對於建議的運算符,我更喜歡它們。
副手我可以想到三個原因:
C#借用了C ++的語法,C ++借用了C的語法,並且C沒有???:::
運算符,因為K&R可能覺得沒有必要。 它不是一個“無用的運算符”,但將被視為語法糖。
而且,依賴於枚舉聲明中常量的特定順序對操作員來說不是一個好主意。
條件評估為是或否。 您不存在的運算符的擬議算法是什么? 很難說它是否有用,但是開關箱可以滿足您的需求。
除了在大多數實際情況下不安全,不必要和可能不可讀之外,主要問題是它促進了如今大多數人認為很糟糕的編程模型。
大多數語言都具有允許和想要提升的編程/設計風格。 C#允許命令式和過程式編程,但促進了面向對象技術的使用。 您的操作員堅定地屬於第一陣營,而不是該語言的設計師想要支持的東西。
如果您確實想以這種風格進行編程,則可以使用:
myValue = (f == Fruit.apple) ? fnApple()
: (f == Fruit.mango) ? fnMango()
: fnOrange();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.