Чтобы решить эту проблему, вы должны удалить Date time
в качестве аргумента вашего конструктора. Ваш конструктор должен выглядеть следующим образом:
public messgaesDataClass(String messageText, int messageStatus, String messagefrom) {
this.messageText = messageText;
this.messageStatus = messageStatus;
this.messagefrom = messagefrom;
}
Нет необходимости инициализировать объект time
в вашем конструкторе. Серверы Firebase будут читать ваше поле time
как ServerTimestamp
(из-за аннотации) и заполнять это поле соответствующей отметкой времени сервера.
В основном есть два метода. 1. Используйте параметры out / ref 2. Вернуть массив объектов
Классы, структуры, коллекции и массивы могут содержать несколько значений. Выходные и опорные параметры также могут быть установлены в функции. Возврат нескольких значений возможен в динамических и функциональных языках с помощью кортежей, но не в C #.
В C # 4 вы сможете использовать встроенную поддержку для кортежей, чтобы легко с этим справиться.
Между тем, есть две опции.
Во-первых, вы можете использовать параметры ref или out для назначения значений вашим параметрам, которые передаются обратно в вызывающую подпрограмму.
Это выглядит так:
void myFunction(ref int setMe, out int youMustSetMe);
Во-вторых, вы может обернуть ваши возвращаемые значения в структуру или класс и передать их обратно как члены этой структуры. KeyValuePair хорошо работает для 2 - для более чем 2 вам понадобится пользовательский класс или структура.
Нет, вы не можете вернуть несколько значений из функции в 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';
}
Есть несколько способов сделать это. Вы можете использовать параметры 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) { }
Этот последний подход проще и легче для чтения и понимания.
Вы либо возвращаете класс экземпляр или использовать параметры 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
Предыдущий постер прав. Вы не можете вернуть несколько значений из метода C #. Однако у вас есть пара опций:
За и против здесь часто трудно понять. Если вы возвращаете структуру, убедитесь, что она мала, потому что структуры являются типом значения и передаются в стек. Если вы возвращаете экземпляр класса, здесь есть некоторые шаблоны проектирования, которые вы, возможно, захотите использовать, чтобы избежать проблем - члены классов могут быть изменены, потому что C # передает объекты по ссылке (у вас нет ByVal, как в VB ).
Наконец, вы можете использовать выходные параметры, но я бы ограничил их использование сценариями, когда у вас есть только пара (например, 3 или меньше) параметров - в противном случае все становится уродливым и сложным в обслуживании. Кроме того, использование выходных параметров может быть препятствием для гибкости, поскольку сигнатура вашего метода будет меняться каждый раз, когда вам нужно что-то добавить к возвращаемому значению, тогда как при возврате экземпляра структуры или класса вы можете добавлять члены без изменения сигнатуры метода.
С архитектурной точки зрения я бы рекомендовал не использовать пары ключ-значение или словари. Я считаю, что этот стиль кодирования требует «секретных знаний» в коде, который использует метод.
Если вы имеете в виду возврат нескольких значений, вы можете либо вернуть класс / структуру, содержащую значения, которые вы хотите вернуть, либо используйте ключевое слово "out" для ваших параметров, например, так:
public void Foo(int input, out int output1, out string output2, out string errors) {
// set out parameters inside function
}
Вы не можете сделать это в C # , Что вы можете сделать, это иметь параметр 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; }
}
Существуют многие путь; но если Вы не хотите создавать новый Объект или структуру или что-то вроде этого, как что можно сделать ниже после 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");
}