-1

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

4 回答 4

4

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

我能为您提供的最佳解决方案是使用带ref参数的函数。由于无论如何您都在尝试对一堆任意整数变量进行操作,因此您仍然必须将它们全部列出。如何通过函数调用来做到这一点,如下所示:

void Increase(ref int x) {
    x++;
}

int a = 10;
int b = 20;

Increase(ref a);
Increase(ref b);
于 2013-03-15T04:16:27.153 回答
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"
}
于 2013-03-15T04:17:34.567 回答
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 
}

笔记

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

警告:这确实是出于娱乐目的 - 请不要在实际代码中尝试。

于 2013-03-15T04:19:04.457 回答
2

您实际上不能在 .NET 中执行此操作。ints 是值类型,因此您不能直接引用它们。

然而,有很多方法可以解决这个问题。这里只有一个:

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 中值类型的设计背道而驰。

于 2013-03-15T04:19:22.367 回答