C#:方法引數之--引用引數
阿新 • • 發佈:2020-09-23
引用引數:方法宣告時,使用ref修飾符修飾的形參稱為引用引數。
- 引用引數與值引數不同,引用引數不建立副本,直接使用實參傳過來的資料
- 呼叫有引用引數的方法時,需要在實參前加上ref關鍵字
- 由於引用引數直接使用實參所指向的資料的位置,所以呼叫方法前實參必須被明確賦值
宣告帶引用引數的方法,並且引用引數為值型別
static void Main(string[] args) { int x; x = 10; AddOne(ref x); Console.WriteLine("呼叫方法後"+x);//11 Console.Read(); } static void AddOne(ref int p) { p = p + 1; Console.WriteLine(p);//11 }
分析:由於引用引數p不會建立副本,所以區域性變數p其實直接操作的就是x指向的儲存位置;所以如果我們在呼叫方法前 不對實參進行初始化或者賦值,他們就無法找到自己表示哪一個記憶體地址的值
宣告帶引用引數的方法,並且引用引數為引用型別,在方法內部,為引用引數賦了一個新值
class Program { static void Main(string[] args) { Student stu; //在呼叫方法前,必須對將要作為引用引數的實參stu顯示賦值 stu = new Student() { Name = "xiaoming", Age = 18 }; Console.WriteLine("呼叫前:"+stu.GetHashCode());//呼叫前:46104728 PrintInfo(ref stu); Console.WriteLine(stu.Name + "--" + stu.Age);//jaychou--33 Console.WriteLine("呼叫後:"+stu.GetHashCode());//呼叫後:12289376 Console.Read(); } static void PrintInfo(ref Student student) { student = new Student() { Name = "jaychou", Age = 33 }; Console.WriteLine(student.GetHashCode());//12289376 Console.WriteLine(student.Name + "--" + student.Age);//jaychou--33 } } class Student { public int Age { get; set; } public string Name { get; set; } }
分析:這裡student作為引用引數,student不再建立副本,所以操作student就是在操作實參stu;當student被新對物件賦值,那麼就相當於stu也被指向新物件
小技巧:如果對於副本什麼的不理解,不妨將引用變數當成實參的別名吧,在呼叫前後並未增加新的記憶體空間。
使用ref引數注意好先賦值後呼叫就好,以上便是對ref引數的總結,記錄下來,以便以後查閱。