Я прочитал версию этого вопроса на C ++, но не понял этого.
Может кто-нибудь, пожалуйста, объясните четко, если это можно сделать и как?
Я прочитал версию этого вопроса на C ++, но не понял этого.
Может кто-нибудь, пожалуйста, объясните четко, если это можно сделать и как?
В C # 7 и выше, смотрите этот ответ .
В предыдущих версиях вы можете использовать .NET 4.0 + Tuple :
Например:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
Кортежи с двумя значениями имеют Item1
и Item2
свойства.
public (int sum, int count) GetMultipleValues() { return (1, 2); }
Этот пример взят из нашего примера с документацией по этому вопросу .Теперь, когда C # 7 выпущен, вы можете использовать новый включенный синтаксис Tuples
который затем можно использовать так:
Вы также можете предоставить имена своим элементам (чтобы они не были "Item1", "Item2" и т. Д.). Вы можете сделать это, добавив имя к подписи или методы возврата:
или
Их также можно деконструировать, что является довольно приятной новой функцией:
Проверьте эту ссылку, чтобы увидеть больше примеров того, что можно сделать :)
источник
Вы можете использовать три разных способа
1. параметры ref / out
используя ref:
используя:
2. структура / класс
используя структуру:
используя класс:
3. Кортеж
Класс кортежа
C # 7 кортежей
источник
Вы не можете сделать это в C #. То, что вы можете сделать, это иметь
Использование параметра out Использование пользовательского класса (или структуры)out
параметр или вернуть свой собственный класс (или структуру, если вы хотите, чтобы он был неизменным).источник
async
методов.Tuple
это путь (Я используюout
параметры в синхронных операциях, хотя они действительно полезны в этих случаях.)Если вы имеете в виду возврат нескольких значений, вы можете либо вернуть класс / структуру, содержащую значения, которые вы хотите вернуть, либо использовать ключевое слово «out» для ваших параметров, например, так:
источник
Предыдущий постер прав. Вы не можете вернуть несколько значений из метода C #. Тем не менее, у вас есть несколько вариантов:
За и против здесь часто трудно понять. Если вы возвращаете структуру, убедитесь, что она мала, потому что структуры являются типом значения и передаются в стек. Если вы возвращаете экземпляр класса, здесь есть некоторые шаблоны проектирования, которые вы, возможно, захотите использовать, чтобы избежать проблем - члены классов могут быть изменены, потому что C # передает объекты по ссылке (у вас нет ByVal, как в VB ).
Наконец, вы можете использовать выходные параметры, но я бы ограничил их использование сценариями, когда у вас есть только пара (например, 3 или менее) параметров - в противном случае все становится уродливым и сложным в обслуживании. Кроме того, использование выходных параметров может быть препятствием для гибкости, поскольку сигнатура вашего метода будет меняться каждый раз, когда вам нужно что-то добавить к возвращаемому значению, тогда как возвращая экземпляр структуры или класса, вы можете добавлять члены без изменения сигнатуры метода.
С архитектурной точки зрения я бы рекомендовал не использовать пары ключ-значение или словари. Я считаю, что этот стиль кодирования требует «секретных знаний» в коде, который использует метод. Он должен заранее знать, какими будут ключи и что означают значения, и если разработчик, работающий над внутренней реализацией, изменит способ создания словаря или KVP, он может легко создать каскад сбоев во всем приложении.
источник
Exception
если второе значение, которое вы хотите вернуть, является дизъюнктивным по отношению к первому: например, когда вы хотите вернуть либо тип успешного значения, либо тип неудачного значения.Вы либо возвращает экземпляр класса или использовать из параметров. Вот пример выходных параметров:
Назовите это так:
источник
Есть много способов; но если вы не хотите создавать новый объект или структуру или что-то подобное, вы можете сделать, как показано ниже, после C # 7.0 :
источник
В C # 7 появился новый
Tuple
синтаксис:Вы можете вернуть это как запись:
Вы также можете использовать новый синтаксис деконструктора:
Будьте осторожны с сериализацией, однако, все это синтаксический сахар - в фактическом скомпилированном коде это будет
Tuple<string, int>
( согласно принятому ответу ) сItem1
иItem2
вместоfoo
иbar
. Это означает, что сериализация (или десериализация) будет использовать вместо этих имен свойств.Итак, для сериализации объявите класс записи и верните его вместо этого.
Также новым в C # 7 является улучшенный синтаксис для
out
параметров. Теперь вы можете объявитьout
inline, который лучше подходит в некоторых контекстах:Однако в основном вы будете использовать это в собственных библиотеках .NET, а не в своих собственных функциях.
источник
Другие ответы приведены с использованием Tuple, который я бы тоже рекомендовал, но с использованием новой функции, представленной в C # 7.0.
Дополнительную информацию можно найти здесь .
источник
Есть несколько способов сделать это. Вы можете использовать
ref
параметры:Это передает ссылку на функцию, тем самым позволяя функции изменять объект в стеке вызывающего кода. Хотя это технически не «возвращаемое» значение, это способ заставить функцию сделать нечто подобное. В приведенном выше коде функция будет возвращать
int
и (потенциально) изменятьbar
.Другой аналогичный подход заключается в использовании
out
параметра.out
Параметр идентиченref
параметру с дополнительным, компилятор применяются правила. Это правило заключается в том, что если вы передаетеout
параметр в функцию, эта функция должна установить его значение перед возвратом. Помимо этого правила,out
параметр работает так же, какref
параметр.Последний подход (и лучший в большинстве случаев) заключается в создании типа, который инкапсулирует оба значения и позволяет функции возвращать это:
Этот последний подход проще и легче для чтения и понимания.
источник
Нет, вы не можете вернуть несколько значений из функции в C # (для версий ниже C # 7), по крайней мере, не так, как вы можете сделать это в Python.
Тем не менее, есть несколько альтернатив:
Вы можете вернуть массив объектов типа с несколькими значениями, которые вы хотите в нем.
Вы можете использовать
out
параметры.источник
В C # 4 вы сможете использовать встроенную поддержку для кортежей, чтобы справиться с этим легко.
А пока есть два варианта.
Во-первых, вы можете использовать параметры ref или out для назначения значений вашим параметрам, которые возвращаются в вызывающую подпрограмму.
Это выглядит так:
Во-вторых, вы можете заключить возвращаемые значения в структуру или класс и передать их обратно как члены этой структуры. KeyValuePair хорошо работает для 2 - для более чем 2 вам понадобится пользовательский класс или структура.
источник
Вы можете попробовать эту "KeyValuePair"
Вывод :
Выход: 1, 2
источник
Классы, структуры, коллекции и массивы могут содержать несколько значений. Выходные и опорные параметры также могут быть установлены в функции. Возврат нескольких значений возможен в динамических и функциональных языках с помощью кортежей, но не в C #.
источник
В основном есть два метода. 1. Использовать параметры out / ref. 2. Возвращать массив объектов.
источник
Вот основные
Two
методы:1) Использование '
out
' в качестве параметра. Вы можете использовать 'out' как для 4.0, так и для минорных версий.Пример 'out':
Вывод:
Площадь прямоугольника 20
Периметр прямоугольника 18
* Примечание: *
out
-keyword описывает параметры, чьи фактические местоположения переменных копируются в стек вызываемого метода, где эти же местоположения могут быть переписаны. Это означает, что вызывающий метод получит доступ к измененному параметру.2)
Tuple<T>
Пример кортежа:
Возврат нескольких значений DataType с использованием
Tuple<T>
Вывод
ПРИМЕЧАНИЕ. Использование Tuple действительно с версии 4.0 и выше .
Tuple
Тип этоclass
. Он будет размещен в отдельном месте в управляемой куче в памяти. После того, как вы создадитеTuple
, вы не сможете изменить его значенияfields
. Это делаетTuple
больше похожим наstruct
.источник
Вы можете получить код как
Надеюсь это работает.
источник
Метод, принимающий делегат, может предоставить вызывающей стороне несколько значений. Это заимствовано из моего ответа здесь и использует немного из принятого ответа Хадаса .
Вызывающие операторы предоставляют лямбда (или именованную функцию), а подсказки intellisense копируют имена переменных из делегата.
источник
Просто используйте в ООП класс, как это:
Член функции возвращает частное, в котором большинство абонентов в первую очередь заинтересованы. Кроме того, он сохраняет остаток как элемент данных, который впоследствии легко доступен для вызывающего абонента.
Таким образом, вы можете иметь много дополнительных «возвращаемых значений», что очень полезно, если вы реализуете вызовы базы данных или сети, где может потребоваться множество сообщений об ошибках, но только в случае возникновения ошибки.
Я ввел это решение также в вопрос C ++, на который ссылается OP.
источник
Из этой статьи вы можете использовать три варианта, как сказано выше.
KeyValuePair - самый быстрый способ.
выход на втором.
Кортеж самый медленный.
Во всяком случае, это зависит от того, что лучше для вашего сценария.
источник
Будущая версия C # будет включать именованные кортежи. Посмотрите этот сеанс на канале 9 для демонстрации https://channel9.msdn.com/Events/Build/2016/B889
Перейдите к 13:00 для кортежей. Это позволит такие вещи, как:
(неполный пример из видео)
источник
Вы можете использовать динамический объект. Я думаю, что он лучше читается, чем Tuple.
источник
Способы сделать это:
1) KeyValuePair (лучшая производительность - 0,32 нс):
2) кортеж - 5,40 нс:
3) out (1.64 нс) или ref 4) Создайте свой собственный класс / структуру
нс -> наносекунды
Ссылка: множественные возвращаемые значения .
источник
ты можешь попробовать это
источник
yield return "value1"; yield return "value2";
чтобы не пришлось явно создавать новыйstring[]
?Вы также можете использовать OperationResult
источник
Быстрый ответ специально для возвращаемых типов массивов:
С помощью:
источник