我對函式如何更改通過它傳遞的變數感到困惑。例如,如果我創建了一個變數 t = 1,并通過向其添加 2 來傳遞一個函式,在函式內部 t 是 3,但在 Main 函式中 t 仍然是 1:
static void Main(string[] args)
{
int t = 1;
addTwo(t);
Console.WriteLine(t);
## t=1
Console.ReadLine();
}
static void addTwo(int t)
{
t =2;
Console.WriteLine("inside function {0}",t);
## t=3
函式內部 t 的值為 3,但 Main 中的值保持為 1。
但是,如果我創建了一個值為 {2,3,4,5,6} 的陣列“幸福”并通過一個函式“SunIsShining”,它將每個值增加 2。之后,我認為陣列幸福應該仍然是 {2 ,3,4,5,6}。然而它變成了{4,5,6,7,8}。
static void Main(string[] args)
{
int[] happiness = { 2, 3, 4, 5, 6 };
SunIsShining(happiness);
## happiness = { 4, 5, 6, 7, 8 }
foreach (int y in happiness)
{
Console.WriteLine(y);
}
Console.ReadLine();
}
static void SunIsShining(int[] x)
{
for (int i = 0; i < x.Length; i )
x[i] = 2;
}
誰能幫我理解原因?謝謝!
uj5u.com熱心網友回復:
因為
int[]是一種可能將物件參考傳遞給函式的參考型別,因此您可以修改同一陣列中的值。int是一種值型別,它會在傳遞給函式之前克隆值,因此您修改的值不是t來自Main函式。
我們可以通過這個示例代碼通過ReferenceEquals方法來證明,將比較物件參考是否與下面的相同,假設我們可以看到addTwo是 return false,但SunIsShining回傳 true。
static int t1;
static int[] happiness;
static void Main(string[] args)
{
t1 = 1;
happiness = new int[]{ 2, 3, 4, 5, 6 };
addTwo(t1);
SunIsShining(happiness);
Console.ReadLine();
}
static void addTwo(int t)
{
t =2;
Console.WriteLine("Is same object by value?" object.ReferenceEquals(t1,t));
}
static void SunIsShining(int[] x)
{
Console.WriteLine("Is same object by refer?" object.ReferenceEquals(happiness,x));
}
c# 在線
更多資訊我們可以看到
值型別
參考型別
傳遞引數
uj5u.com熱心網友回復:
變數傳遞分為值傳遞和地址傳遞。
傳值不能改變之前的值,地址傳遞就是傳遞地址,所以可以改變之前的值。
例如,第一個是通過變數名傳遞的。T 存盤一個 int,所以它傳遞一個資料,所以它在函式中傳遞一個 1,與 Main 中的 t 無關。Pass是
后面的值;我們傳遞的是陣列的名字,而陣列的名字是陣列中第一個元素的地址,所以我們傳遞的是地址,所以我們是通過地址來訪問它,改變原來的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/465541.html
下一篇:有沒有辦法在處理中附加一組物件?
