문제

호기심이 없어서 이것을 묻습니다

아래 표현처럼

a = (condition) ? x : y; // two outputs

열거적 인 운영자가없는 이유는 무엇입니까?
말하다,

myValue = f ??? fnApple() : fnMango() : fnOrange(); // no. of outputs specified in the enum definition

스위치 명세서 대신 (리팩토링이 가능하지만)


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

나는 다양한 상황에서 두 기술을 모두 사용했으며 제안 된 연산자보다 훨씬 선호합니다.

다른 팁

Offhand 나는 세 가지 이유를 생각할 수 있습니다.

  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 ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top