欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#入?yún)⑹褂靡妙愋鸵觬ef的原因解析

 更新時間:2022年11月18日 14:59:44   作者:BruceNeter  
這篇文章主要介紹了C#入?yún)⑹褂靡妙愋鸵觬ef的原因解析,我們在實際開發(fā)中還是能夠碰到一些引用類型添加ref的場景,其實道理也是一樣的,就是將引用類型的棧的地址傳遞到了方法中,那么和不添加有啥區(qū)別,感興趣的朋友跟隨小編一起看看吧

摘一段來自官網(wǎng)的說明 :方法的參數(shù)列表中使用 ref 關鍵字時,它指示參數(shù)按引用傳遞,而非按值傳遞。 ref 關鍵字讓形參成為實參的別名,這必須是變量。 換而言之,對形參執(zhí)行的任何操作都是對實參執(zhí)行的。
大體意思就是將實慘的引用作為參數(shù)傳遞,如果入?yún)⒉患觬ef修飾,本身傳遞的是實參的值到方法中。

那什么是值,什么是引用?大體可以理解為堆棧的區(qū)別,在.net中大多數(shù)實例存在于托管堆棧中。struct,int32,int64,double,enum等數(shù)據(jù)類型聲明的實例存在棧中,而string,class,delegate等存在于堆中。前者一般稱為值類型,后者則叫做引用類型,那么引用類型和值類型在內存中的大概圖如下:

可以看到引用類型被存儲的時候真正內容存在堆中,而在stack中存儲了一個堆中地址的引用指向堆中真正內容。

ref修飾入?yún)⒌某S脠鼍?/h3>

當我們希望一個已有返回值的方法能夠修改我一個外部基本類型的值的時候,我們可以將該參數(shù)加上ref關鍵字作為入?yún)ⅰ>唧w原理其實就是將棧中具體的值替換為了棧的引用,說白了就是地址,幻想一下本來你高考作弊只是后臺改了一下自己成績和學霸一樣,學霸的人生沒有受到影響,現(xiàn)在你干脆把學霸的試卷改成了自己名字,學霸直接被你影響只能進廠打螺絲了,當然這個比喻不是很貼切,大家理解到意思就行。
那么為什么引用類型的入?yún)⑽覀儾恍枰砑觬ef?因為從上圖我們能看出來棧中存儲的本來就是引用類型的地址,所以引用類型不需要添加ref關鍵字,當你在方法內部修改了入?yún)⒌囊恍傩灾?,外面的實慘依舊會受到影響。

引用類型添加ref的作用是啥?

我們在實際開發(fā)中還是能夠碰到一些引用類型添加ref的場景。其實道理也是一樣的,就是將引用類型的棧的地址傳遞到了方法中,那么和不添加有啥區(qū)別?我們來看看下面的代碼:

Student student1 = new Student("Jack");
Student student2 = new Student("Lucy");
WithoutRef(student1);
WithRef(ref student2);
Console.WriteLine($"不帶ref的方法---{student1.Name}");
Console.WriteLine($"帶ref的方法---{student2.Name}");

Console.Read();
//不帶ref的方法
static void WithoutRef(Student stu) 
{
    stu.Name = "Bruce";
}

//不帶ref的方法
static void WithRef(ref Student stu)
{
    stu.Name = "Bruce";
}

public class Student
{
	public Student(string name)
	{
        Name = name;

    }
    public string Name { get; set; }
}

可以看到結果一樣的,兩個實例的名字都變了

那我們再看看下面的代碼:

Student student1 = new Student("Jack");
Student student2 = new Student("Lucy");
WithoutRef(student1);
WithRef(ref student2);
Console.WriteLine($"不帶ref的方法---{student1.Name}");
Console.WriteLine($"帶ref的方法---{student2.Name}");

Console.Read();
//不帶ref的方法
static void WithoutRef(Student stu) 
{
    stu = new Student("Bruce");
}

//不帶ref的方法
static void WithRef(ref Student stu)
{
    stu = new Student("Bruce");
}

public class Student
{
	public Student(string name)
	{
        Name = name;

    }
    public string Name { get; set; }
}

我們發(fā)現(xiàn)第一個不帶ref的方法名字沒有發(fā)生變化。
代碼的變化就是第二個例子重新new了一下,我們根據(jù)上面的原理分析就能知道為啥。由于ref將引用類型的棧地址傳遞過去了,new關鍵字大體就是在堆中開辟一個新空間,然后將空間地址存儲到棧中,由于ref將棧地址傳遞過來了,所以就將棧中的存儲地址替換為了新開辟的堆地址了,而不帶ref的引用類型本身傳遞的只是堆中地址的引用,所以new關鍵字等于說將形參重新開辟空間和分配了,和實參已經(jīng)不是同一個地方了。

總結

ref傳遞的是棧地址
不帶ref傳遞的是棧中存儲的值,可能是一個值,也可能是一個地址引用。

到此這篇關于C#入?yún)⑹褂靡妙愋鸵觬ef的原因解析的文章就介紹到這了,更多相關c#引用類型加ref內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c#分頁讀取GB文本文件實例

    c#分頁讀取GB文本文件實例

    這篇文章主要介紹了c#分頁讀取GB文本文件的方法,對于C#實現(xiàn)對大數(shù)據(jù)量的讀取非常具有實用價值,需要的朋友可以參考下
    2014-11-11
  • Unity制作圖片字體的方法

    Unity制作圖片字體的方法

    這篇文章主要為大家詳細介紹了Unity制作圖片字體的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • WinForm中的登錄實現(xiàn)

    WinForm中的登錄實現(xiàn)

    在一般的C/S系統(tǒng)中,登錄功能基本上是必備功能,總結了三種C# Winform登錄功能的實現(xiàn)方法
    2012-11-11
  • C#實現(xiàn)把dgv里的數(shù)據(jù)完整的復制到一張內存表的方法

    C#實現(xiàn)把dgv里的數(shù)據(jù)完整的復制到一張內存表的方法

    這篇文章主要介紹了C#實現(xiàn)把dgv里的數(shù)據(jù)完整的復制到一張內存表的方法,需要的朋友可以參考下
    2014-08-08
  • C#類的創(chuàng)建與初始化實例解析

    C#類的創(chuàng)建與初始化實例解析

    這篇文章主要介紹了C#類的創(chuàng)建與初始化實例解析,有助于初學者較為直觀的理解C#的類,需要的朋友可以參考下
    2014-07-07
  • C#數(shù)據(jù)結構與算法揭秘一

    C#數(shù)據(jù)結構與算法揭秘一

    本文一介紹了數(shù)據(jù)結構的基本概念 而介紹了算法的基本概念,并且重點討論了算法時間復雜度,并且用程序予以證明
    2012-11-11
  • 用c# 自動更新程序

    用c# 自動更新程序

    這篇文章主要介紹了用c# 自動更新程序的代碼示例,幫助大家更好的理解和使用c#編程語言,感興趣的朋友可以了解下
    2020-11-11
  • 在C#中如何使用正式表達式獲取匹配所需數(shù)據(jù)

    在C#中如何使用正式表達式獲取匹配所需數(shù)據(jù)

    本文給大家分享C#中如何使用正式表達式獲取匹配所需數(shù)據(jù) ,非常實用,對正則表達式獲取匹配相關知識感興趣的朋友一起學習吧
    2016-03-03
  • WPF彈出右鍵菜單時判斷鼠標是否選中該項

    WPF彈出右鍵菜單時判斷鼠標是否選中該項

    這篇文章介紹了WPF彈出右鍵菜單時判斷鼠標是否選中該項的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C# 最齊全的上傳圖片方法

    C# 最齊全的上傳圖片方法

    本文主要介紹了C# 最齊全的上傳圖片方法,方法里包括了圖片大小限制、圖片尺寸、文件內容等等的判斷。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01

最新評論