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也被指向新對象
引用類型引用參數

小技巧:如果對於副本什么的不理解,不妨將引用變量當成實參的別名吧,在調用前后並未增加新的內存空間。

聲明引用參數,並且參數類型是引用類型,在調用方法中未創建新的對象賦值給形參,只操作對象的屬性。

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; }
}

說明:雖然這種操作方式和值參數--類型為引用類型的輸出效果一致,但是在內存中兩者是不同的。
引用類型值參數VS引用類型引用參數

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM