2016-12-12 3 views
1

Я только что написал программу с мужественными делами и переключателями. Итак, в C# есть ли способ избежать случаев и переключателей? На мой взгляд, в конце концов я получил своего рода «грязную» программу. Все остальные старшие разработчики полного стека, они сказали, что это хорошо и так далее.О случаях и переключателях в C# действительно ли они нужны?

Но в принципе я просто интересуюсь вашими мыслями в этой теме? Знаете ли вы, что лучший способ делать интеллектуальное кодирование без случаев и переключателей?

В основном это в моем характере вопросительно вещей, статус-кво ....

+2

это зависит от того, что вы кодирования, переключите заявлениями являются экологически чистым и эффективным – BugFinder

+1

Определением «смарт кодирования». Блоки переключателя/корпуса - это инструменты, как и все остальное в спецификации языка C#. В нем есть места, которые идеально подходят для других мест, и что-то другое было бы более подходящим. Я скажу, что вы не должны их влагать. – Abion47

+0

Всё зависит от меня. Если есть много случаев, и случаи могут быть добавлены в будущем, может оказаться более подходящей таблица поиска. –

ответ

4

Каждый конкретный случай требует своего собственного решения. Бывают случаи, когда сотни строк манекен-кода выглядят намного лучше, чем красивая сложная логика с рекурсиями, ссылки на сторонние стороны, LINQ и т. Д.

Но говорить об альтернативах я могу предложить словари:

var switchCaseAlternative = new Dictionary<string, Action>() 
{ 
    {"case1",() => {System.Diagnostic.Debug.WriteLine("One");}}, 
    {"case2",() => {System.Diagnostic.Debug.WriteLine("Two");}} 
}; 

то инструкция использование будет выглядеть следующим образом:

switchCaseAlternative["case1"](); 
+1

Perfect никогда не видел этого, так что теперь я пойду домой и прочитаю об этом. – Andy

+0

Это настоящая прохладная вещь. Я никогда не видел этого. Я буду помнить это! – TripleEEE

+1

Хотя это изящная альтернатива, я не уверен, что когда-нибудь буду рекомендовать ее. Единственный раз, когда я увижу это как более желательный вариант, чем switch/case, - это то, что программа динамически добавляет операторы case во время выполнения. В противном случае это также громоздко (если не более) для большего объема памяти и снижения производительности. – Abion47

2

Вы можете попробовать использовать наследование ваших классов. Переключатель означает, что вам нужно делать что-то похожее с разными значениями. Надежды, что ниже пример может помочь понять мою мысль:

public enum SexTypes { Unknown, Male, Female } 

public abstract class Human 
{ 
    protected string HelloMessage = "common message part"; 
    public abstract SexTypes Sex { get; } 

    public void SayHello() => Console.WriteLine(HelloMessage); //good way 

    public void SayHelloWithSwitch() //bad way 
    { 
     switch(Sex) 
     { 
      case SexTypes.Unknown: 
       Console.WriteLine(HelloMessage); 
       break; 
      case SexTypes.Male: 
       Console.WriteLine(HelloMessage + " some modifications"); 
       break; 
      case SexTypes.Female: 
       Console.WriteLine("new other message"); 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 
} 

public class Boy : Human 
{ 
    public override SexTypes Sex => SexTypes.Male; 
    protected new string HelloMessage => base.HelloMessage += " , some message modifications"; 
} 

public class Girl : Human 
{ 
    public override SexTypes Sex => SexTypes.Female; 
    protected new string HelloMessage = "overwrite all message"; 
} 
Смежные вопросы