Возможно ли, чтобы функция возвращала два значения? Массив возможен, если два значения являются одинаковыми, но как вы возвращаете два разных значения типа?
Возможно ли, чтобы функция возвращала два значения?
Ответ 1
Может ли функция возвращать 2 отдельных значения? Нет, функция в С# может возвращать только одно значение.
Можно использовать другие понятия, чтобы вернуть 2 значения. Первое, что приходит на ум, - это использовать тип упаковки, например Tuple<T1,T2>
.
Tuple<int,string> GetValues() {
return Tuple.Create(42,"foo");
}
Тип Tuple<T1,T2>
доступен только в 4.0 и выше. Если вы используете более раннюю версию фреймворка, вы можете либо создать свой собственный тип, либо использовать KeyValuePair<TKey,TValue>
.
KeyValuePair<int,string> GetValues() {
return new KeyValuePair<int,sting>(42,"foo");
}
Другой метод - использовать параметр out (я бы очень рекомендовал подход с кортежем, хотя).
int GetValues(out string param1) {
param1 = "foo";
return 42;
}
Ответ 2
Одним словом, нет.
Но вы можете определить struct
(или class
, если на то пошло):
struct TwoParameters {
public double Parameter1 { get; private set; }
public double Parameter2 { get; private set; }
public TwoParameters(double param1, double param2) {
Parameter1 = param1;
Parameter2 = param2;
}
}
Это, конечно, слишком специфично для одной проблемы. Более гибким подходом было бы определить общий struct
как Tuple<T1, T2>
(как предлагал JaredPar):
struct Tuple<T1, T2> {
public T1 Property1 { get; private set; }
public T2 Property2 { get; private set; }
public Tuple(T1 prop1, T2 prop2) {
Property1 = prop1;
Property2 = prop2;
}
}
(Обратите внимание, что что-то очень похожее на приведенное выше, на самом деле является частью .NET в 4.0 и выше, по-видимому.)
Тогда у вас может быть какой-то метод, который выглядит так:
public Tuple<double, int> GetPriceAndVolume() {
double price;
int volume;
// calculate price and volume
return new Tuple<double, int>(price, volume);
}
И код вроде этого:
var priceAndVolume = GetPriceAndVolume();
double price = priceAndVolume.Property1;
int volume = priceAndVolume.Property2;
Ответ 3
Это невозможно. Вам нужно вернуть единственный параметр, который обертывает два параметра или использует параметры:
object Method(out object secondResult)
{
//...
Или:
KeyValuePair<object,object> Method()
{
// ..
Ответ 4
Не напрямую. Ваши варианты - либо вернуть какую-то пользовательскую структуру или класс с несколькими свойствами, используйте KeyValuePair, если вы просто хотите вернуть два значения или использовать параметры вывода.
Ответ 5
Все возможные решения пропускают один важный момент; почему вы хотите вернуть два значения из метода? Как я вижу это, возможны два случая; a) вы возвращаете два значения, которые действительно должны быть инкапсулированы в один объект (например, высота и ширина чего-то, поэтому вы должны вернуть объект, который представляет что-то), или b) это запах кода, и вам действительно нужно подумать о том, почему метод возвращает два значения (например, метод действительно выполняет две вещи).
Ответ 6
У вас есть в основном (по крайней мере) два варианта: либо вы выставляете параметр out в дополнение к возвращаемому значению функции, что-то вроде T1 Function(out T2 second)
, либо вы создаете свой собственный класс, объединяющий эти два типа, что-то вроде Pair<T1,T2>
. Я лично предпочитаю второй путь, но это ваш выбор.
Ответ 7
В С# вы можете вернуть более одного значения, используя параметр out. См. Пример в методе TryParse для Int32 struct. Он возвращает bool и целое число в параметре out.
Ответ 8
нет, но вы можете использовать параметр out
int whatitis;
string stuff = DoStuff(5, out whatitis);
public string DoStuff(int inParam, out int outParam)
{
outParam = inParam + 10;
return "donestuff";
}
Ответ 9
Невозможно вернуть более одного значения из функции, если вы не возвращаете тип, который содержит в себе несколько значений (Struct, Dictionary и т.д.). Единственным способом было бы использовать ключевые слова "out" или "ref" для входящих параметров.
Ответ 10
Вы можете использовать параметр out.
int maxAge;
int minAge;
public int GetMaxAgeAndMinAge(out int maxAge, out int minAge)
{
MaxAge = 60;
MinAge = 0;
return 1; //irrelevant for this example since we care about the values we pass in
}
Я действительно стараюсь держаться подальше от этого, я думаю, что это кодовый запах. Это работает быстро и грязно. Более проверяемым и лучшим подходом было бы передать объект, который представляет ваш домен (необходимость увидеть два этих двух значения).
Ответ 11
вы можете попробовать это
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
Ответ 12
Чтобы вернуть 2 значения, я обычно использую класс Pair из http://blog.o-x-t.com/2007/07/16/generic-pair-net-class/. Если вам нужно вернуться из значений метода 2, которые описывают диапазон, например. От /To или Min/Max вы можете использовать класс FromToRange.
public class FromToRange<T>
{
public T From { get; set; }
public T To { get; set; }
public FromToRange()
{
}
public FromToRange(T from, T to)
{
this.From = from;
this.To = to;
}
public override string ToString()
{
string sRet = String.Format("From {0} to {1}", From, To);
return sRet;
}
public override bool Equals(object obj)
{
if (this == obj) return true;
FromToRange<T> pair = obj as FromToRange<T>;
if (pair == null) return false;
return Equals(From, pair.From) && Equals(To, pair.To);
}
public override int GetHashCode()
{
return (From != null ? From.GetHashCode() : 0) + 29 * (To != null ? To.GetHashCode() : 0);
}
}