static void increment(int num)
{
num++;
}
static void Main(string[] args)
{
int x = 30;
Console.WriteLine(x);
increment(x);
Console.WriteLine(x);
}
嗨,我想知道为什么这段代码的结果是30和30,没有任何变化?谢谢!
static void increment(int num)
{
num++;
}
static void Main(string[] args)
{
int x = 30;
Console.WriteLine(x);
increment(x);
Console.WriteLine(x);
}
嗨,我想知道为什么这段代码的结果是30和30,没有任何变化?谢谢!
因为在函数增量中,参数是按值传递的,而不是按引用传递的。
如果你想看到 x 改变,要么做
static int increment (int num)//parameter passed by value, but function now returns an incremented value, not void.
{
num++;
return num;
}
static void Main (string[] args)
{
int x=30;
Console.WriteLine(x);
x = increment(x);
Console.WriteLine(x);
}
或者
static void increment (ref int num)//num is passed by ref now
{
num++;
}
static void Main (string[] args)
{
int x=30;
Console.WriteLine(x);
increment(ref x);
Console.WriteLine(x);
}
原因是因为 int 的值被传递,而不是引用。
如果您将增量更改为接受 (ref int) 并调用它 -increment (ref x)
它会更改它
您的增量方法基本上什么都不做。它不返回修改后的值。该num++
行将增加num
一,但您不会从中返回任何内容。所以num
永远都是一样的。ref
例如,您可以使用关键字传递 ref
static void increment (ref int num)
{
num++;
}
这会改变 num31
在你的第二个 writeline 调用中给你的值。
因为int
是值类型。它不是通过引用传递的。它是按值传递的(创建副本并传递给方法)。num
因此,对方法中参数的任何修改increment
都不会影响x
调用代码中的值。在方法中只x
修改了值的副本。increment
static void increment(int num) // here you have copy of x
{
num++; // copy is modified
}
static void Main(string[] args)
{
int x = 30;
Console.WriteLine(x);
increment(x); // x stays here and not passed into method
Console.WriteLine(x);
}
原因是您通过值而不是引用传递了 num 变量。按值传递时,变量的值被复制到本地副本中,然后本地副本递增,但在方法完成后销毁。如果你通过引用传递你的变量,那么变量的地址被传递给方法并且原始变量被改变,而不是它的副本。
static void increment (ref int num)
{
num++;
}
然后你调用这个方法
increment(ref x);
int
is 值类型和所有其他值类型一样,如果不使用关键字,则始终按值传递ref
。与这些不同,类类型作为引用传递,并且在方法中更改它们会更改原始对象。
x 是本地定义的。
如果您尝试Console.WriteLine(num);
打印increment (int num)
它将打印 31。
int 是值类型,您需要将参数声明为 ref:
static void increment (ref int num)