C#如何对待它们就像阵列一样?

时间:2013-03-15 04:09:20

标签: c#

假设我有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

4 个答案:

答案 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中值类型的设计。