簡體   English   中英

枚舉運算符

[英]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]();

恐怕我在各種情況下都使用了這兩種技術,並且相對於建議的運算符,我更喜歡它們。

副手我可以想到三個原因:

  1. 很脆 如果有人決定對枚舉進行重新排序,那么最終將導致調用錯誤的函數。
  2. 這不是顯而易見的。 如果不切換到枚舉定義並檢查枚舉的順序,我將無法理解哪種功能將在這種情況下運行。
  3. 每個功能都以負100分開頭。 這樣的事情不可能證明規范,構建,記錄和測試所需的工作,特別是與其他功能相比時, 尤其是在該語言中已經存在高度可行的替代方法時。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM