2014-02-14 2 views
4

У меня есть метод, который должен возвращать разные типы данных на основе поиска. Я рассматриваю два подхода, так как я новичок в C#. Я не знаю, что лучше, поэтому, пожалуйста, помогите мне задуматься.Как вернуть несколько типов данных из метода C#?

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

public int Get(string name){ 
    //... 
    return intValue; 
} 

public double Get(string name){ 
    //... 
    return doubleValue; 
} 

public string Get(string name){ 
    //... 
    return stringValue; 
} 

Второй подход, чтобы иметь различные методы для каждого типа данных, например так:

public int GetInt(string name){ 
    //... 
    return intValue; 
} 

public double GetDouble(string name){ 
    //... 
    return doubleValue; 
} 

public string GetString(string name){ 
    //... 
    return stringValue; 
} 

какой из них является безопасным для C#, учитывая, что этот код будет опубликован из DLL?

+6

Я бы сказал, что идти со вторым, так как первый не будет компилировать. – neeKo

+0

Вы пытались реализовать свой первый подход? – Jonesopolis

ответ

8

Первый способ нет даже возможно. Вы не можете перегружать методы, только изменяя их тип возврата.

В зависимости от того, что код делает вы могли бы сделать это родовое:

public T Get<T>(string name){ 
    //... 
    return somegenericvalue; 
} 

Но я подозреваю, что вы бы с помощью отражения в любом случае, чтобы решить, что делать, так что преимущество дженериков бы быть сведены на нет. Плюс вы не можете ограничивать его только указанными вами типами (string, int, double)

Главное преимущество использования разных методов по типу - сильная типизация. Для пользователей список поддерживаемых типов ограничен, поэтому им не нужно беспокоиться о том, поддерживает ли метод Get определенный тип. Для писателя вы можете написать код для этого типа. поэтому вам не нужно отражать, проверять тип, лить, разбор и т. д. быть общим - вы можете написать код только для этого типа.

Это может выглядеть как избыточный код, но вы все равно можете реорганизовать, чтобы помещать общие части во внутренние «вспомогательные» методы.

FYI Рамки делает это в некоторых местах, так что это не неслыханное:

С другой стороны, существуют методы расширения, которые предпочитают использовать общий методы:

Но, как правило, это просто методы pass_through, они не делают никакого преобразования , для которого потребуется код для определенных типов.

+1

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

+1

Преимущества над чем? Дженерики? Ваш первый метод невозможен, поэтому, если вы не хотите использовать generics, вы _need_ использовали второй метод. –

+0

Хорошо, спасибо. Это все, что я хотел знать. –

0

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

public T Get<T>(string name) 
{ 
    ... 
} 
+2

Это не единственный способ, пример в вопросе (тот, который компилируется) действителен, а также лучше, поскольку он может ограничить количество возвращаемых типов. Кстати, вопрос был в том, что был самым безопасным способом, и поскольку ваш будет бросать исключение времени выполнения (или значения по умолчанию, которые могут быть хуже) для неподдерживаемых типов, это определенно не самый безопасный способ сделать это. – neeKo

0

Вы можете использовать следующий подход

public T GetT<T>(string name) 
{ 
    // Code goes here 
    return T; 
} 

Итак, когда вы проходите двойной вы получите двойной , Когда вы передаете int, вы получите int и так далее. В приведенном выше подходе используются дженерики для решения вашей проблемы. Для документации о дженериках, пожалуйста, смотрите здесь http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx

+1

Это дубликат существующего ответа. – Servy

+0

Я начал отвечать на вопрос, и одновременно, я его тестировал. Когда я представил его, я увидел другие ответы. Если это проблема, я могу ее удалить. – Christos

1

Вы можете использовать Tuples (мне не нравится вещь ItemX, но все еще опция). Скажите, что вам нужен метод возврата объекта person, строки и числа. Вы можете просто закодировать следующее:

public static Tuple<Person, string, int> GetMyData() 
{ 
    var person = GetPerson(); 
    var text = "Hello"; 
    var number = 2016; 

    var result = Tuple.Create(person, text, number); 
    return result; 
} 

вызова метода и доступа возвращаемые данные следующим образом:

var data = GetMyData(); 
data.Item1; // person 
data.Item2; // text 
data.Item3; // number 

В вашей ситуации, я хотел бы использовать параметр, чтобы указать, какой тип поиска.

public Tuple<int, double, string> Search(searchPattern) 
{ 
    if (serachPattern == "double") 
    { 
     double myDouble = SearchDouble(); 
     return Tuple.Create(0, myDouble, null); 
    } 

    // Handle other patterns here 
} 

Использование:

var myDouble = Search("double").Item2; 
var myString = Search("string").Item3; 
var myInt = Search("int").Item1; 
Смежные вопросы