Возврат нескольких массивов из метода - PullRequest
0 голосов
/ 26 марта 2020

Я хочу вернуть несколько массивов из метода, который использует несколько операторов if. Я проверил тело кода, и он работает для себя. Теперь я хочу воссоздать его в метод, который я могу вызвать, но я получаю некоторые ошибки (не все пути кода возвращают значение). Я знаю, что ошибка заключается в том, что оператор if ничего не возвращает, но я не уверен, как я могу исправить ошибку и все же получить желаемую функциональность.

Вот код метода:

private byte[] GetParameterBuff(string[] statement, ref byte[] tdi, ref byte[] tdo, ref byte[] mask, ref byte[] smask)
{
    string[] parameters;
    char[] delimiter = new char[] { '(', ')' };
    int numBits = Convert.ToInt32(statement[1]);

    if (numBits > 0)
    {
        Console.WriteLine("The amount of bits sent in the message is: " + numBits);
        for (int p = 2; p < statement.Length; p++)
        {
            parameters = statement[p].Split(delimiter, StringSplitOptions.RemoveEmptyEntries);

            if (parameters[0] == "TDI")
            {
                tdi = ConvertHexStringToByteArray(parameters[1]);
                foreach (byte b in tdi)
                {
                    Console.WriteLine("The tdi array is: " + b);
                }
                return tdi;

            }

            else if (parameters[0] == "TDO")
            {
                tdo = ConvertHexStringToByteArray(parameters[1]);
                foreach (byte b in tdo)
                {
                    Console.WriteLine("The tdo array is: " + b);
                }
                return tdo;
            }

            else if (parameters[0] == "MASK")
            {
                mask = ConvertHexStringToByteArray(parameters[1]);
                foreach (byte b in mask)
                {
                    Console.WriteLine("The mask array is: " + b);
                }
                return mask;
            }

            else if (parameters[0] == "SMASK")
            {
                smask = ConvertHexStringToByteArray(parameters[1]);
                foreach (byte b in smask)
                {
                    Console.WriteLine("The smask array is: " + b);
                }
                return smask;
            }

            else
            {
                return null;
            }


        }

        return ??;

    }
    else
    {
        Console.WriteLine("The amount of bits sent in the message is: " + numBits);
        return null;
    }


}

1 Ответ

0 голосов
/ 26 марта 2020

Если вы хотите использовать синтаксис «out» для нескольких возвращаемых значений, вы должны использовать out byte[] tdi вместо ref byte[] tdi. Это говорит о том, что вызывающая сторона не должна указывать существующее значение. Это, однако, означает, что вам нужно назначить каждый параметр out перед возвратом из метода.

Чтобы вернуть несколько значений, вы можете использовать синтаксис ValueTuple, то есть

public (byte[] tdi, byte[] tdo, byte[] mask) GetParameterBuff(string[] statement)

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

public class MyArrays
{
    public byte[] Tdi { get; }
    public byte[] Tdo { get; }
    public byte[] Mask { get; }

    public MyArrays(byte[] tdi, byte[] tdo, byte[] mask)
    {
        Tdi = tdi;
        Tdo = tdo;
        Mask = mask;
    }
}

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

  • Исключение
  • Нуль
  • A Возможно / Опция
  • bool, возвращающий успех / неудачу и выходной параметр (и) для значений
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...