有没有办法在C#中实现“void func(out params object [] parameters)”

时间:2010-07-21 21:46:57

标签: c# params out

我想要做的是能够将任意数量的变量传递给函数,操作函数内部的那些变量,并且可以访问函数范围之外的那些操作。

实施例

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

为了澄清,这是我正在尝试做的事情。将一个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 []输出信息。

3 个答案:

答案 0 :(得分:4)

不,你不能。

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

params将始终将参数的复制到新数组中。那时他们与原始变量脱离关系。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

您知道,您的“澄清”与原始问题完全不同。听起来你正在尝试编写反序列化代码。首先,阅读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所期望的不匹配,则可能必须在BinaryReader.ReadeByte()之上构建自己的函数。另请注意,从缓冲区填充“一系列变量”的函数有一些代码味道......当然这些变量在某种程度上是相关的,并且您有机会定义一个表示(使用反序列化器!)的类无论那个概念是什么。