1. 程式人生 > 實用技巧 >C#:方法引數之--引用引數

C#:方法引數之--引用引數

引用引數:方法宣告時,使用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引數的總結,記錄下來,以便以後查閱。