最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

可以看到引用類型被存儲(chǔ)的時(shí)候真正內(nèi)容存在堆中,而在stack中存儲(chǔ)了一個(gè)堆中地址的引用指向堆中真正內(nèi)容。

ref修飾入?yún)⒌某S脠?chǎng)景

當(dāng)我們希望一個(gè)已有返回值的方法能夠修改我一個(gè)外部基本類型的值的時(shí)候,我們可以將該參數(shù)加上ref關(guān)鍵字作為入?yún)?。具體原理其實(shí)就是將棧中具體的值替換為了棧的引用,說(shuō)白了就是地址,幻想一下本來(lái)你高考作弊只是后臺(tái)改了一下自己成績(jī)和學(xué)霸一樣,學(xué)霸的人生沒(méi)有受到影響,現(xiàn)在你干脆把學(xué)霸的試卷改成了自己名字,學(xué)霸直接被你影響只能進(jìn)廠打螺絲了,當(dāng)然這個(gè)比喻不是很貼切,大家理解到意思就行。
那么為什么引用類型的入?yún)⑽覀儾恍枰砑觬ef?因?yàn)閺纳蠄D我們能看出來(lái)?xiàng)V写鎯?chǔ)的本來(lái)就是引用類型的地址,所以引用類型不需要添加ref關(guān)鍵字,當(dāng)你在方法內(nèi)部修改了入?yún)⒌囊恍傩灾担饷娴膶?shí)慘依舊會(huì)受到影響。

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

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

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

可以看到結(jié)果一樣的,兩個(gè)實(shí)例的名字都變了

那我們?cè)倏纯聪旅娴拇a:

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)第一個(gè)不帶ref的方法名字沒(méi)有發(fā)生變化。
代碼的變化就是第二個(gè)例子重新new了一下,我們根據(jù)上面的原理分析就能知道為啥。由于ref將引用類型的棧地址傳遞過(guò)去了,new關(guān)鍵字大體就是在堆中開(kāi)辟一個(gè)新空間,然后將空間地址存儲(chǔ)到棧中,由于ref將棧地址傳遞過(guò)來(lái)了,所以就將棧中的存儲(chǔ)地址替換為了新開(kāi)辟的堆地址了,而不帶ref的引用類型本身傳遞的只是堆中地址的引用,所以new關(guān)鍵字等于說(shuō)將形參重新開(kāi)辟空間和分配了,和實(shí)參已經(jīng)不是同一個(gè)地方了。

總結(jié)

ref傳遞的是棧地址
不帶ref傳遞的是棧中存儲(chǔ)的值,可能是一個(gè)值,也可能是一個(gè)地址引用。

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

相關(guān)文章

  • C# WebApi 接口傳參詳解

    C# WebApi 接口傳參詳解

    這篇文章主要介紹了C# WebApi 接口傳參詳解,本篇打算通過(guò)get、post、put、delete四種請(qǐng)求方式分別談?wù)劵A(chǔ)類型(包括int/string/datetime等)、實(shí)體、數(shù)組等類型的參數(shù)如何傳遞。感興趣的小伙伴們可以參考一下
    2018-07-07
  • C# 操作PostgreSQL 數(shù)據(jù)庫(kù)的示例代碼

    C# 操作PostgreSQL 數(shù)據(jù)庫(kù)的示例代碼

    本篇文章主要介紹了C# 操作PostgreSQL 數(shù)據(jù)庫(kù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • C#9新特性之增強(qiáng)的模式匹配

    C#9新特性之增強(qiáng)的模式匹配

    這篇文章主要介紹了C#9新特性之增強(qiáng)的模式匹配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C# WebApi 接口返回值不困惑:返回值類型詳解

    C# WebApi 接口返回值不困惑:返回值類型詳解

    這篇文章主要介紹了C# WebApi 接口返回值不困惑:返回值類型詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • C#實(shí)現(xiàn)猜數(shù)字小游戲

    C#實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • DataGridView設(shè)置單元格的提示內(nèi)容ToolTip

    DataGridView設(shè)置單元格的提示內(nèi)容ToolTip

    這篇文章介紹了DataGridView設(shè)置單元格提示內(nèi)容ToolTip的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 一文掌握C# ListView控件的用法和示例代碼

    一文掌握C# ListView控件的用法和示例代碼

    ListView控件提供了豐富的屬性和事件,可以用于實(shí)現(xiàn)各種各樣的表格視圖,包括帶有單元格編輯、排序和分組等功能,本文介紹了一些常見(jiàn)的?ListView?控件的用法和示例代碼,感興趣的朋友一起看看吧
    2024-02-02
  • Unity3D在Preview中打印日志的方法

    Unity3D在Preview中打印日志的方法

    這篇文章主要為大家詳細(xì)介紹了Unity3D在Preview中打印日志的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C#中實(shí)現(xiàn)網(wǎng)段掃描的代碼

    C#中實(shí)現(xiàn)網(wǎng)段掃描的代碼

    C#中實(shí)現(xiàn)網(wǎng)段掃描的代碼...
    2007-04-04
  • C# WinForm窗體編程中處理數(shù)字的正確操作方法

    C# WinForm窗體編程中處理數(shù)字的正確操作方法

    這篇文章主要介紹了C# WinForm窗體編程中處理數(shù)字的正確操作方法,本文給出了正確示例,并解釋了為什么要這么做,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

呈贡县| 朔州市| 上思县| 海盐县| 通化县| 昭平县| 济南市| 南京市| 周口市| 增城市| 共和县| 翁源县| 宿松县| 措勤县| 丘北县| 小金县| 上蔡县| 手机| 额敏县| 井陉县| 大化| 永顺县| 漳州市| 张北县| 澄城县| 兴宁市| 论坛| 江口县| 乌拉特中旗| 丰顺县| 丰台区| 乐至县| 比如县| 民乐县| 乾安县| 南平市| 建瓯市| 天门市| 庆阳市| 绥江县| 曲沃县|