我想要做的是能够将任意数量的变量传递给函数,操作函数内部的那些变量,并且可以访问函数范围之外的那些操作。
实施例
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 []输出信息。
答案 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()之上构建自己的函数。另请注意,从缓冲区填充“一系列变量”的函数有一些代码味道......当然这些变量在某种程度上是相关的,并且您有机会定义一个表示(使用反序列化器!)的类无论那个概念是什么。