Возвратите несколько значений вызывающей стороне метода

Чтобы решить эту проблему, вы должны удалить Date time в качестве аргумента вашего конструктора. Ваш конструктор должен выглядеть следующим образом:

public messgaesDataClass(String messageText, int messageStatus, String messagefrom) {
    this.messageText = messageText;
    this.messageStatus = messageStatus;
    this.messagefrom = messagefrom;
}

Нет необходимости инициализировать объект time в вашем конструкторе. Серверы Firebase будут читать ваше поле time как ServerTimestamp (из-за аннотации) и заполнять это поле соответствующей отметкой времени сервера.

389
задан Alexander Abakumov 9 May 2019 в 12:41
поделиться

10 ответов

В основном есть два метода. 1. Используйте параметры out / ref 2. Вернуть массив объектов

4
ответ дан blitzkriegz 22 November 2019 в 23:47
поделиться

Классы, структуры, коллекции и массивы могут содержать несколько значений. Выходные и опорные параметры также могут быть установлены в функции. Возврат нескольких значений возможен в динамических и функциональных языках с помощью кортежей, но не в C #.

5
ответ дан Jose Basilio 22 November 2019 в 23:47
поделиться

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

Между тем, есть две опции.

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

Это выглядит так:

void myFunction(ref int setMe, out int youMustSetMe);

Во-вторых, вы может обернуть ваши возвращаемые значения в структуру или класс и передать их обратно как члены этой структуры. KeyValuePair хорошо работает для 2 - для более чем 2 вам понадобится пользовательский класс или структура.

10
ответ дан Reed Copsey 22 November 2019 в 23:47
поделиться

Нет, вы не можете вернуть несколько значений из функции в C # (для версий ниже C # 7), в по крайней мере, не так, как вы можете это сделать в Python.

Однако есть пара альтернатив:

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

private object[] DoSomething()
{
    return new [] { 'value1', 'value2', 3 };
}

Вы можете использовать из параметров.

private string DoSomething(out string outparam1, out int outparam2)
{
    outparam1 = 'value2';
    outparam2 = 3;
    return 'value1';
}
11
ответ дан Francisco Noriega 22 November 2019 в 23:47
поделиться

Есть несколько способов сделать это. Вы можете использовать параметры ref :

int Foo(ref Bar bar) { }

Это передает ссылку на функцию, тем самым позволяя функции изменять объект в стеке вызывающего кода. Хотя это технически не «возвращаемое» значение, это способ заставить функцию сделать нечто подобное. В приведенном выше коде функция возвращает int и (потенциально) изменяет bar .

Другой аналогичный подход заключается в использовании параметра out . Параметр out идентичен параметру ref с дополнительным правилом, применяемым компилятором. Это правило состоит в том, что если вы передаете параметр в функцию, эта функция должна установить свое значение перед возвратом. Помимо этого правила, параметр out работает так же, как параметр ref .

Последний подход (и лучший в большинстве случаев) заключается в создании типа, который инкапсулирует оба значения и позволяет функции возвращать следующее:

class FooBar 
{
    public int i { get; set; }
    public Bar b { get; set; }
}

FooBar Foo(Bar bar) { }

Этот последний подход проще и легче для чтения и понимания.

11
ответ дан Andrew Hare 22 November 2019 в 23:47
поделиться

Вы либо возвращаете класс экземпляр или использовать параметры out . Вот пример выходных параметров:

void mymethod(out int param1, out int param2)
{
    param1 = 10;
    param2 = 20;
}

Назовите это так:

int i, j;
mymethod(out i, out j);
// i will be 20 and j will be 10
19
ответ дан Bugs 22 November 2019 в 23:47
поделиться

Предыдущий постер прав. Вы не можете вернуть несколько значений из метода C #. Однако у вас есть пара опций:

  • Возвращать структуру, которая содержит несколько членов
  • Возвращать экземпляр класса
  • Использовать выходные параметры (используя out или ref ключевые слова)
  • Использовать словарь или пару ключ-значение в качестве выходных данных

За и против здесь часто трудно понять. Если вы возвращаете структуру, убедитесь, что она мала, потому что структуры являются типом значения и передаются в стек. Если вы возвращаете экземпляр класса, здесь есть некоторые шаблоны проектирования, которые вы, возможно, захотите использовать, чтобы избежать проблем - члены классов могут быть изменены, потому что C # передает объекты по ссылке (у вас нет ByVal, как в VB ).

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

С архитектурной точки зрения я бы рекомендовал не использовать пары ключ-значение или словари. Я считаю, что этот стиль кодирования требует «секретных знаний» в коде, который использует метод.

33
ответ дан Kevin Hoffman 22 November 2019 в 23:47
поделиться

Если вы имеете в виду возврат нескольких значений, вы можете либо вернуть класс / структуру, содержащую значения, которые вы хотите вернуть, либо используйте ключевое слово "out" для ваших параметров, например, так:

public void Foo(int input, out int output1, out string output2, out string errors) {
    // set out parameters inside function
}
38
ответ дан Chris Doggett 22 November 2019 в 23:47
поделиться

Вы не можете сделать это в C # , Что вы можете сделать, это иметь параметр out или вернуть свой собственный класс (или структуру, если вы хотите, чтобы она была неизменной).

Использование параметра out
public int GetDay(DateTime date, out string name)
{
  // ...
}
Использование пользовательского класса (или структуры)
public DayOfWeek GetDay(DateTime date)
{
  // ...
}

public class DayOfWeek
{
  public int Day { get; set; }
  public string Name { get; set; }
}
74
ответ дан Samuel 22 November 2019 в 23:47
поделиться

Существуют многие путь; но если Вы не хотите создавать новый Объект или структуру или что-то вроде этого, как что можно сделать ниже после C# 7.0:

 (string firstName, string lastName) GetName(string myParameter)
    {
        var firstName = myParameter;
        var lastName = myParameter + " something";
        return (firstName, lastName);
    }

    void DoSomethingWithNames()
    {
        var (firstName, lastName) = GetName("myname");

    }
9
ответ дан 22 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: