🤖 像個郵差一樣~值與址的傳遞
在呼叫方法時,難免會需要傳遞參數,
那這些參數該如何傳遞呢?
在傳遞的過程中,究竟是傳值還是傳址呢?
傳值
- 在呼叫方法時我們難免需要將參數做傳遞
- 值得傳遞,表示他們在記憶體中,會佔不同的空間
- 當值傳遞完成後他們之間將毫無關係
範例:我們來輸入兩個數字,並且將他們比大小
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CsharpDemo
{
class Program
{
static void Main(string[] args)
{
//宣告X整數
int x = Convert.ToInt32(Console.ReadLine());
//宣告y整數
int y = Convert.ToInt32(Console.ReadLine());
//呼叫Bigger方法,並將x,y的直傳入
int reault = Bigger(x, y);
Console.WriteLine("x = " + x + " ,y = " + y);
Console.WriteLine("最大值為" + reault);
Console.ReadKey();
}
//比較兩數大小的方法,將x y 傳入
static int Bigger(int x, int y)
{
//判斷x y誰大
int maxValue = (x >= y) ? x : y;
return maxValue;
}
}
}
輸入:
1
5
結果:
1
5
x = 1 ,y = 5
最大值為 5
我們這邊使用到了三元條件運算子
,它的結構如下:
中斷點
- 中斷點,是 debug 時非常好用的一個功能
- 如果對程式碼的執行有任何疑問,基本上都是可以使用中斷點做逐步執行的
中斷點使用方式:
在想要停止的程式前面點一下,會出現小紅點(快捷鍵:F9)
接下來我們執行程式,會發現執行到此行時程式停下來了
這時候我們到功能列上按逐步執行(快捷鍵:F11),會發現按一下就執行一行程式,這樣我們就可以了解程式如何執行了
如果我們逐步執行程式後,會發現原來呼叫方法時,程式會先進入方法執行,執行完再回到原本程式繼續執行
址的傳遞
- 假設有一個擁有上百的參數的陣列,做參數的傳遞,等於又得在記憶體中切割一樣大小的空間出來
- 因此像陣列或結構體複雜的傳遞,他傳的是記憶體所在的位址,而不是傳遞參數
- 傳遞後新的陣列也會指向相同的記憶體位置,因此做任何異動時都會影響到原來的陣列
範例:我們用 List 來驗證傳址的行為吧
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CsharpDemo
{
class Program
{
static void Main(string[] args)
{
//宣告一個Llist
List<string> myList = new List<string>() { "孤獨一隻雞", "人生一條蟲", "寂寞一隻鳥", "爆肝一隻鵝" };
Console.WriteLine("原始筆數 = " + myList.Count());
//呼叫方法並傳入List
int newCount = ListCount(myList);
Console.WriteLine("目前筆數 = " + newCount);
//這時候我們用foreach迴圈來拆解原本的List
foreach(string item in myList)
{
Console.Write(item + " ");
}
Console.ReadKey();
}
//我們使用一個方法並接收list的傳遞,然後回傳list的筆數
static int ListCount(List<string> newList)
{
//我們在這list偷偷加一隻魚
newList.Add("高冷一隻魚");
return newList.Count();
}
}
結果:
原始筆數 = 4
目前筆數 = 5
孤獨一隻雞 人生一條蟲 寂寞一隻鳥 爆肝一隻鵝 高冷一隻魚
我們可以發現,我們明明在新的方法,新的List去修改List,結果原來的List卻受到影響,這就是因為他們指向的記憶體位置是同一個地方,所以只要一有變動所有資料都會受到影響