2011-01-13 2 views
2

Я работаю над чем-то, где мне понадобится вернуть перечисление и массив ints. Я могу обойти всю проблему и использовать int вместо enum и добавить ее в качестве первого элемента массива, но перечисление действительно помогает моей четкости кода. Есть ли способ вернуть оба в одно и то же время?C# Возвращение enum и int array

+1

Ответ дает разумные варианты, но я не могу помочь, но думаю, что есть большая проблема дизайна решить здесь. Можете ли вы описать, что делает этот метод, что он возвращает изменчивый набор целых чисел и нумерованный тип? –

ответ

11

Существует 3 общих решения. Какой Уместно будет зависеть от конкретной ситуации, и ваши личные предпочтения:

  1. Используйте out параметр для одного из них. Это не требует каких-либо новых типов, но неудобно звонить. Кроме того, он не может семантически фиксировать взаимосвязь между возвращаемыми значениями.

    public int[] MyMethod(out MyEnumType myEnum) 
    { 
        myEnum = ... 
        int[] nums = ...  
        return nums; 
    } 
    
  2. Tuple<,> Используйте тип (.NET 4.0). Для этого требуется только построение замкнутого родового типа из существующего типа BCL, но вызывающим абонентам может не понравиться тот факт, что инкапсулированные свойства имеют бессмысленные имена: Item1 и Item2 Вы также можете ввести тип KeyValuePair<,> или написать собственный тип Pair<,> для обслуживания аналогичная цель.

    public Tuple<int[], MyEnumType> MyMethod() 
    { 
        int[] nums = ... 
        MyEnumType myEnum = ... 
        return Tuple.Create(nums, myEnum); 
    } 
    
  3. Напишите класс-обертку, который инкапсулирует целочисленный массив и ENUM. Больше работы, но лучше всего работать с вызывающим.

    public class Wrapper 
    { 
        public int[] Nums { get { ... } } 
        public MyEnumType MyEnum { get { ... } } 
    } 
    ... 
    public Wrapper MyMethod() 
    { 
        Wrapper wrapper = ... 
        return wrapper; 
    } 
    
+0

Я думал об использовании класса-оболочки. Не знал, что у C# есть кортежи, поэтому я думаю, что это будет путь. Знаете ли вы, есть ли какое-либо влияние на производительность при использовании Tuples? – user472875

+3

@ user472875: Класс Wrapper действительно был бы способ пойти, если они имеют логический смысл. –

+0

@ user472875: Не должно быть; это действительно легкий вес. Если вам интересно, вы можете использовать декомпилятор, чтобы посмотреть на его источник. Как и при любых других проблемах с производительностью, используйте профилировщик, чтобы определить, что проблема заключается в построении оболочки (пользовательской или кортежей), а затем профилировать каждую альтернативу. – Ani