2010-05-27 5 views
6

HiiМетод должен возвращать несколько значений

У меня есть метод в C#, мне нужно вернуть несколько значений из этого метода, используя коллекции, такие как массивы. Есть ли надежный способ?

+0

Можете ли вы расширить "несколько значений"? Является ли это постоянным числом ваших возвращаемых значений? Связаны ли они логически? Что они представляют? Являются ли они одного типа? – Kobi

+0

Возможный дубликат [Как вернуть несколько значений из функции в C#?] (Http://stackoverflow.com/questions/748062/how-can-i-return-multiple-values-from-a-function-in -c) –

ответ

10

Ну, вы могли бы использовать:

  • а/STRUCT/тип пользовательского класса, содержащий все значения
  • out параметры

Ie:

class MyValues 
{ 
    public string Val1 { get; set; } 
    public int Val2 {get; set; } 
} 

public MyValues ReturnMyValues(); 

или

public void ReturnMyValues(out string Val1, out int Val2); 
2

Да может создать новый тип, который будет содержать несколько свойств, а затем вернуть этот тип:

public MyType MyMethod() 
{ 
    return new MyType 
    { 
     Prop1 = "foo", 
     Prop2 = "bar" 
    }; 
} 
15

Да, out ключевое слово:

public void ReturnManyInts(out int int1, out int int2, out int int3) 
{ 
    int1 = 10; 
    int2 = 20; 
    int3 = 30; 
} 

тогда называть это так:

int i1, i2, i3; 
ReturnManyInts(out i1, out i2, out i3); 

Console.WriteLine(i1); 
Console.WriteLine(i2); 
Console.WriteLine(i3); 

, который выдает:

10 
20 
30 

EDIT:

Я вижу, что много сообщений предполагают, чтобы создать свой собственный класс для этого. Это необязательно, так как .net предоставляет вам класс, чтобы делать то, что они говорят уже. Класс Tuple.

public Tuple<int, string, char> ReturnMany() 
{ 
    return new Tuple<int, string, char>(1, "some string", 'B'); 
} 

, то вы можете получить его следующим образом:

var myTuple = ReturnMany(); 
myTuple.Item1 ... 
myTuple.Item2 ... 

существуют общие перегрузки, так что вы можете иметь до 8 уникальных типов в вашем наборе.

+3

Кроме того, метод 'Tuple.Create' может вызывать типы:' return Tuple.Create (1, "some string", 'B'); ' –

+3

Обратите внимание, что Tuple - это новая функция .NET 4.0, которые Джибу не могут (пока) иметь. –

0

Класс дескриптора или структура. Вы должны поместить его где-нибудь, так как логично, что метод должен возвращать только одно значение. В качестве альтернативы вы можете использовать out или ref, но я бы вернулся в класс.

Btw, что удерживает вас, чтобы не использовать коллекции ?.

2

Почему использование 'out' является ненадежным? (Или же вы допустили опечатку, и имел в виду, не?)

Есть несколько способов:

  • возвращает объект, который содержит несколько значения (структура/класс и т.д.)
  • out
  • ref
5

Если вы используете .NET 4.0 вы можете использовать один из классов generic Tuple для возврата нескольких значений из вызова метода. Статический класс Tuple предоставляет методы создания объектов Tuple. Таким образом, вам не нужно определять свой собственный тип возврата для метода.

public Tuple<string,int> Execute() 
{ 
    return new Tuple<string,int>("Hello World", 2); 
} 
+0

Только незначительная точка: все 8 типов Tuple являются общими для C# 4.0. – Kobi

0
public int Method Name(out string stringValue, out int intValue) 
{ 
    /// 
      Method goes here 
    /// 

    return intVaraible 
} 

здесь вы получите 3 Возвращаемые значения 1. stringValue 2. intValue 3. intVariable

Смежные вопросы