c#如何像对待数组一样对待整型

本文关键字:整型 一样 数组 何像 | 更新日期: 2023-09-27 18:04:13

假设我有5个int ,它们不是数组!,我想在一个循环中改变它们。有没有办法使一个数组将得到这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

c#如何像对待数组一样对待整型

我认为有一种方法可以解决这个问题,如果你放松要求-有实体数组,将允许修改一组本地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 
}
指出

    直接使用委托,你必须用()调用它们。
  • 它可能会修复()而不是++的问题包装委托到一个对象,将调用增加作为其++实现....
  • Set版本的问题,其中需要调用(3)而不是= 3将需要更多的技巧-实现自定义类与索引重定向set [index]调用保存的setter函数。

警告:这实际上是为了娱乐目的-请不要在实际代码中尝试。

我想用下面的语句作为前言。虽然这是你想要的…它很丑。这更符合你假设你可以用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"
}

一般来说,这里的答案是。这将要求c#允许对整数(或其他值类型)的引用,而它不允许(并且有充分的理由)

我能为你想出的最好的解决方案是使用一个带有ref参数的函数。既然你要对一堆任意的整数变量进行操作,你还是得把它们都列出来。不如用函数调用来实现,像这样:

void Increase(ref int x) {
    x++;
}
int a = 10;
int b = 20;
Increase(ref a);
Increase(ref b);

在。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"

尽管你真的不应该这样做。