Я работаю над чем-то, где мне понадобится вернуть перечисление и массив ints. Я могу обойти всю проблему и использовать int вместо enum и добавить ее в качестве первого элемента массива, но перечисление действительно помогает моей четкости кода. Есть ли способ вернуть оба в одно и то же время?C# Возвращение enum и int array
ответ
Существует 3 общих решения. Какой Уместно будет зависеть от конкретной ситуации, и ваши личные предпочтения:
Используйте
out
параметр для одного из них. Это не требует каких-либо новых типов, но неудобно звонить. Кроме того, он не может семантически фиксировать взаимосвязь между возвращаемыми значениями.public int[] MyMethod(out MyEnumType myEnum) { myEnum = ... int[] nums = ... return nums; }
Tuple<,>
Используйте тип (.NET 4.0). Для этого требуется только построение замкнутого родового типа из существующего типа BCL, но вызывающим абонентам может не понравиться тот факт, что инкапсулированные свойства имеют бессмысленные имена:Item1
иItem2
Вы также можете ввести типKeyValuePair<,>
или написать собственный типPair<,>
для обслуживания аналогичная цель.public Tuple<int[], MyEnumType> MyMethod() { int[] nums = ... MyEnumType myEnum = ... return Tuple.Create(nums, myEnum); }
Напишите класс-обертку, который инкапсулирует целочисленный массив и ENUM. Больше работы, но лучше всего работать с вызывающим.
public class Wrapper { public int[] Nums { get { ... } } public MyEnumType MyEnum { get { ... } } } ... public Wrapper MyMethod() { Wrapper wrapper = ... return wrapper; }
Я думал об использовании класса-оболочки. Не знал, что у C# есть кортежи, поэтому я думаю, что это будет путь. Знаете ли вы, есть ли какое-либо влияние на производительность при использовании Tuples? – user472875
@ user472875: Класс Wrapper действительно был бы способ пойти, если они имеют логический смысл. –
@ user472875: Не должно быть; это действительно легкий вес. Если вам интересно, вы можете использовать декомпилятор, чтобы посмотреть на его источник. Как и при любых других проблемах с производительностью, используйте профилировщик, чтобы определить, что проблема заключается в построении оболочки (пользовательской или кортежей), а затем профилировать каждую альтернативу. – Ani
Ответ дает разумные варианты, но я не могу помочь, но думаю, что есть большая проблема дизайна решить здесь. Можете ли вы описать, что делает этот метод, что он возвращает изменчивый набор целых чисел и нумерованный тип? –