假设我有5个int ,它们不是数组!,我想在1个循环中更改它们。有没有办法制作一个数组,它将获得这5个数字的值,并可以直接改变它们?
类似的东西:
int a = 10;
int b = 20;
int[] rihanna = // .... ?
for(int a=0; a<rihanna.length;a++)
rihanna[a]++;
Console.WriteLine("{0} {1} ",a,b) // what I want to see here is 11 and 21
答案 0 :(得分:4)
一般来说,这里的答案是否。这将要求C#允许引用整数(或其他值类型),which it does not(并且有充分的理由。)
我能为您提出的最佳解决方案是使用ref
parameter的函数。既然你试图对一堆任意整数变量进行操作,你仍然需要将它们全部列出来。如何通过函数调用来实现,如下所示:
void Increase(ref int x) {
x++;
}
int a = 10;
int b = 20;
Increase(ref a);
Increase(ref b);
答案 1 :(得分:4)
我想以下面的陈述作为序言。虽然这样做你想要的......但它很难看。这更符合你假设你可以“只做”C#的事情。实际上它更难。
unsafe {
int* a = stackalloc int[1];
int* b = stackalloc int[1];
*a = 10;
*b = 20;
int*[] rihanna = { a, b };
for (int i = 0; i < rihanna.Length; i++) {
(*rihanna[i])++;
}
Console.WriteLine("{0} {1} ", *a, *b); // "11 21"
}
答案 2 :(得分:4)
我认为如果放宽要求,有一种方法可以解决它 - 有一组实体允许通过对数组的操作修改一组本地int
变量。
为此,可以捕获对每个ref int val
的委托数组中的变量的引用。
void Increase(ref int x)
{
x++;
}
void Set(ref int x, int amount)
{
x = amount;
}
void Sample()
{
int a = 10;
int b = 20;
// Array of "increase variable" delegates
var increaseElements = new Action[] {
() => Increase(ref a),
() => Increase(ref b)
};
increaseElements[0](); // call delegate, unfortunately () instead of ++
Console.WriteLine(a); // writes 11
// And now with array of "set the variable" delegates:
var setElements = new Action<int>[] {
v => Set(ref a,v),
v => Set(ref b,v)
};
setElements[0](3);
Console.WriteLine(a); // writes 3
}
注释
()
而不是++
问题,该对象将调用Increase作为其++
实现.... Set
版本的问题,需要调用(3)
而不是= 3
需要更多技巧 - 使用索引实现自定义类以重定向set [index]
以调用已保存的setter函数警告:这实际上是出于娱乐目的 - 请不要在实际代码中尝试。
答案 3 :(得分:2)
你无法在.NET中实际执行此操作。 int
是值类型,因此您无法直接引用它们。
然而,有很多方法可以解决这个问题。这只是一个:
class IntReference
{
int Value { get; set; }
}
IntReference a = new IntReference() { Value = 10 };
IntReference b = new IntReference() { Value = 20 };
IntReference[] rihanna = { a, b };
for (int i = 0; i < rihanna.Length; i++)
rihanna[i].Value = rihanna[i].Value + 1;
Console.WriteLine("{0} {1} ", a.Value, b.Value); // "11 21"
虽然你真的不应该这样做,但永远。它违背了.NET中值类型的设计。