Есть ли способ реализовать "void func (out params object [] parameters)" в C # - PullRequest
2 голосов
/ 22 июля 2010

Что я хотел бы сделать, так это уметь передавать любое количество переменных в функцию, манипулировать этими переменными внутри функции и иметь доступ к этим манипуляциям вне области действия функции.

Пример

void FunctionA()
{
    int x = 1;
    string s = "blah";
    int y = 4;
    FunctionB(out x, out s, out y);
    Console.WriteLine("{0}, {1}, {2}", x, s, y);
}
void FunctionB(out params object[] parameters)
{
    for(int ii = 0; ii < parameters.Length; ii++)
    {
        if(parameters[ii] is int) parameters[ii] = (int)parameters[ii] + 1;
    }
}

После вызова FunctionA () на консоли должно быть «2, бла, 5». Есть ли способ сделать это, за исключением возврата объекта [] и анализа нужных мне переменных?

Для пояснения, вот что я пытаюсь сделать. Передайте byte [] в функцию вместе с множеством переменных. Попытайтесь прочитать информацию из байта [] и назначить ее переменным, которые были переданы. Поэтому, если у меня есть int, строка и другое int, записанные в байт [], и я передаю что-то вроде:

int x, y;
string s;
byte[] info = ...;
FunctionB(info, x, s, y);
Console.WriteLine("{0}, {1}, {2}", x, s, y);

Выводит информацию из байта [].

Ответы [ 3 ]

4 голосов
/ 22 июля 2010

Нет, вы не можете.

Здесь у вас есть один выходной параметр, а вам нужно несколько отдельных выходных параметров. C # не поддерживает это с помощью params ... и params - единственный способ получить различное количество параметров, если только вы не хотите перегружать его до максимального количества параметров, которое вы хотите поддерживать.

params всегда будет копировать значения аргументов в новый массив. В этот момент они не связаны с исходными переменными.

0 голосов
/ 22 июля 2010

Просто, чтобы вы знали, ваше "разъяснение" сильно отличается от вашего первоначального вопроса. Похоже, вы пытаетесь написать код десериализации. Сначала прочитайте документы MSDN Serialization , чтобы узнать больше о функциональности, которую может предоставить .NET. Если создание само-десериализации объектов для вашей конкретной ситуации является излишним, вам следует рассмотреть возможность использования BinaryReader для чтения данных:

byte[] info...
int x;
string s;
int y;

using (BinaryReader reader = new BinaryReader(new MemoryStream(info)))
{
    x = reader.ReadInt32();
    s = reader.ReadString();
    y = reader.ReadInt32();
}

Обратите внимание, что вам, возможно, придется создавать свои собственные функции поверх BinaryReader.ReadeByte (), если ваша кодировка данных не соответствует ожидаемой BinaryReader. Также обратите внимание, что функция, которая заполняет «множество переменных» из буфера, имеет некоторый запах кода ... конечно, эти переменные связаны каким-то образом, и у вас есть возможность определить класс (с десериализатором!), Который представляет какой бы ни была эта концепция.

0 голосов
/ 22 июля 2010

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

void Main()
{
    object [] f = new object []{ 1, "blah", 4 };
    Test( f );
    Console.WriteLine("{0}, {1}, {2}", f[0], f[1], f[2]);
    // output
    // 2, blah, 5 

}

void Test ( object[] parameters )
{
    for(int ii = 0; ii < parameters.Length; ii++)
    {
        if(parameters[ii] is int) 
            parameters[ii] = (int)parameters[ii] + 1;
    }
}
...