2

我想做的是能够将任意数量的变量传递到函数中,在函数内部操作这些变量,并在函数范围之外访问这些操作。

例子

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, blah, 5”。有没有办法做到这一点,而不是返回一个 object[] 并解析出我想要的变量?

为了澄清起见,这就是我正在尝试做的事情。将 byte[] 和大量变量一起传递给函数。尝试从 byte[] 中读取信息并将其分配给传入的变量。因此,如果我将一个 int、一个字符串和另一个 int 写入 byte[] 并传入如下内容:

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

它将从 byte[] 输出信息。

4

3 回答 3

4

不,你不能。

在这里,您有一个单独的输出参数,而您需要几个单独的输出参数。C# 不支持通过params... 并且params是获取不同数量参数的唯一方法,除非您想将其重载到您想要支持的最大参数数量。

params将始终将参数的复制到新数组中。那时,它们与原始变量无关。

于 2010-07-21T21:49:40.493 回答
0

你确定你需要出局吗?你能给我们真实的代码吗?从我可以告诉你发布的内容来看,这很有效......

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;
    }
}
于 2010-07-21T22:00:08.590 回答
0

正如您所知,您的“澄清”与您最初的问题完全不同。听起来您正在尝试编写反序列化代码。首先,阅读MSDN 序列化文档以了解更多关于 .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 期望的不匹配,您可能必须在 BinaryReader.ReadeByte() 之上构建自己的函数。另请注意,从缓冲区填充“大量变量”的函数有一些代码气味......这些变量肯定以某种方式相关,并且您有机会定义一个代表的类(使用反序列化器!)不管那个概念是什么。

于 2010-07-21T23:02:24.697 回答