引用參數:方法聲明時,使用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也被指向新對象

小技巧:如果對於副本什么的不理解,不妨將引用變量當成實參的別名吧,在調用前后並未增加新的內存空間。
聲明引用參數,並且參數類型是引用類型,在調用方法中未創建新的對象賦值給形參,只操作對象的屬性。
class Program
{
static void Main(string[] args)
{
Student stu;
//在調用方法前,必須對將要作為引用參數的實參stu顯示賦值
stu = new Student() { Name = "xiaoming", Age = 18 };
Console.WriteLine("調用前:" + stu.GetHashCode());//調用前:45653674
PrintInfo(ref stu);
Console.WriteLine(stu.Name + "--" + stu.Age);//周周--18
Console.WriteLine("調用后:" + stu.GetHashCode());//調用后:45653674
Console.Read();
}
static void PrintInfo(ref Student student)
{
student.Name = "周周";
Console.WriteLine(student.GetHashCode());//45653674
Console.WriteLine(student.Name + "--" + student.Age);//周周--18
}
}
class Student
{
public int Age { get; set; }
public string Name { get; set; }
}
說明:雖然這種操作方式和值參數--類型為引用類型的輸出效果一致,但是在內存中兩者是不同的。

使用ref參數注意好先賦值后調用就好,以上便是對ref參數的總結,記錄下來,以便以后查閱。
