欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

全面解析C#中參數(shù)傳遞-創(chuàng)新互聯(lián)

一、引言

對(duì)于一些初學(xué)者(包括工作幾年的人在內(nèi))來說,有時(shí)候?qū)τ诜椒ㄖg的參數(shù)傳遞的問題感覺比較困惑的,因?yàn)橹霸诿嬖嚨倪^程也經(jīng)常遇到參數(shù)傳遞的基礎(chǔ)面試題,這樣的面試題主要考察的開發(fā)人員基礎(chǔ)是否扎實(shí),對(duì)于C#中值類型和引用類型有沒有深入的一個(gè)理解——這個(gè)說的理解并不是簡單的對(duì)它們簡單一個(gè)定義描述,而在于它們?cè)趦?nèi)存中分布。所以本文章將帶領(lǐng)大家深入剖析下C#中參數(shù)傳遞的問題,并分享我自己的一個(gè)理解,只有你深入理解了才能在不運(yùn)行程序的情況就可以分析出參數(shù)傳遞的結(jié)果的。

欽南ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

二、按值傳遞

對(duì)于C#中的參數(shù)傳遞,根據(jù)參數(shù)的類型可以分為四類:

  • 值類型參數(shù)的按值傳遞

  • 引用類型參數(shù)的按值傳遞

  • 值類型參數(shù)的按引用傳遞

  • 引用類型參數(shù)的按引用傳遞

然而在默認(rèn)情況下,CLR方法中參數(shù)的傳遞都是按值傳遞的。為了幫助大家全面理解參數(shù)的傳遞,下面就這四種情況一一進(jìn)行分析。

2.1 值類型參數(shù)的按值傳遞

對(duì)于參數(shù)又分為:形參和實(shí)參,形參指的是被調(diào)用方法中的參數(shù),實(shí)參指的是調(diào)用方法的參數(shù),下面結(jié)合代碼幫助大家理解形參和實(shí)參的概念:

class Program
    {
        static void Main(string[] args)
        {
                                           
            int addNum = 1;
            // addNum 就是實(shí)參,
            Add(addNum);
         }
        // addnum就是形參,也就是被調(diào)用方法中的參數(shù)
        private static void Add(int addnum)
        {
            addnum = addnum + 1;
            Console.WriteLine(addnum);
        }
}

對(duì)于值類型的按值傳遞,傳遞的是該值類型實(shí)例的一個(gè)拷貝,也就是形參此時(shí)接受到的是實(shí)參的一個(gè)副本,被調(diào)用方法操作是實(shí)參的一個(gè)拷貝,所以此時(shí)并不影響原來調(diào)用方法中的參數(shù)值,為了證明這點(diǎn),看看下面的代碼和運(yùn)行結(jié)果就明白了:

class Program
    {
        static void Main(string[] args)
        {
            // 1. 值類型按值傳遞情況
            Console.WriteLine("按值傳遞的情況");
            int addNum = 1;
            Add(addNum);
            Console.WriteLine(addNum);  
                                    
            Console.Read();
        }
        // 1. 值類型按值傳遞情況
        private static void Add(int addnum)
        {
            addnum = addnum + 1;
            Console.WriteLine(addnum);
        }

運(yùn)行結(jié)果為:

全面解析C#中參數(shù)傳遞

從結(jié)果中可以看出addNum調(diào)用方法之后它的值并沒有改變,Add 方法的調(diào)用只是改變了addNum的副本addnum的值,所以addnum的值修改為2了。然而我們的分析到這里并沒有結(jié)束,為了讓大家深入理解傳遞傳遞,我們有必要知道為什么值類型參數(shù)的按值傳遞不會(huì)修改實(shí)參的值,相信下面這張圖可以解釋你所有的疑惑:

全面解析C#中參數(shù)傳遞

2.2 引用類型參數(shù)的按值傳遞

當(dāng)傳遞的參數(shù)是引用類型的時(shí)候,傳遞和操作的是指向?qū)ο蟮囊茫吹竭@里,有些朋友會(huì)覺得此時(shí)不是傳遞引用嗎?怎么還是按值傳遞了?對(duì)于這個(gè)疑惑,此時(shí)確實(shí)是按值傳遞,此時(shí)傳遞的對(duì)象的地址,傳遞地址本身也是傳遞這個(gè)地址的值,所以此時(shí)仍然是按值傳遞的),此時(shí)方法的操作就會(huì)改變?cè)瓉淼膶?duì)象。對(duì)于這點(diǎn)可能看文字描述會(huì)比較難理解下面結(jié)合代碼和分析圖來幫助大家理解下:

class Program
    {
        static void Main(string[] args)
        {
            // 2. 引用類型按值傳遞情況
            RefClass refClass = new RefClass();
            AddRef(refClass);
            Console.WriteLine(refClass.addnum);
        }   
         // 2. 引用類型按值傳遞情況
        private static void AddRef(RefClass addnumRef)
        {
            addnumRef.addnum += 1;
            Console.WriteLine(addnumRef.addnum);
        }
}
class RefClass
    {
        public int addnum=1;
    }

運(yùn)行結(jié)果為:

全面解析C#中參數(shù)傳遞

為什么此時(shí)傳遞引用就會(huì)修改原來實(shí)參中的值呢?對(duì)于這點(diǎn)我們還是參數(shù)在內(nèi)存中分布圖來解釋下:

全面解析C#中參數(shù)傳遞

2.3 .String引用類型的按值傳遞的特殊情況

對(duì)于String類型同樣是引用類型,然而對(duì)于string類型的按值傳遞時(shí),此時(shí)引用類型的按值傳遞卻不會(huì)修改實(shí)參的值,可能很多朋友對(duì)于這點(diǎn)很困惑,下面具體看看下面的代碼:

class Program
    {
        static void Main(string[] args)
        {
              // 3. String引用類型的按值傳遞的特殊情況
            string str = "old string";
            ChangeStr(str);
            Console.WriteLine(str);
                              
        }
                          
         // 3. String引用類型的按值傳遞的特殊情況
        private static void ChangeStr(string oldStr)
        {
            oldStr = "New string";
            Console.WriteLine(oldStr);
        }
}

運(yùn)行結(jié)果為:

全面解析C#中參數(shù)傳遞

對(duì)于為什么原來的值沒有被改變主要是因?yàn)閟tring的“不變性”,所以在被調(diào)用方法中執(zhí)行 oldStr="New string"代碼時(shí),此時(shí)并不會(huì)直接修改oldStr中的"old string"值為"New string",因?yàn)閟tring類型是不變的,不可修改的,此時(shí)內(nèi)存會(huì)重新分配一塊內(nèi)存,然后把這塊內(nèi)存中的值修改為 “New string”,然后把內(nèi)存中地址賦值給oldStr變量,所以此時(shí)str仍然指向 "old string"字符,而oldStr卻改變了指向,它最后指向了 "New string"字符串。所以運(yùn)行結(jié)果才會(huì)像上面這樣,下面內(nèi)存分布圖可以幫助你更形象地理解文字表述:

全面解析C#中參數(shù)傳遞

三、按引用傳遞

不管是值類型還是引用類型,我們都可以使用ref 或out關(guān)鍵字來實(shí)現(xiàn)參數(shù)的按引用傳遞,然而按引用進(jìn)行傳遞的時(shí)候,需要注意下面兩點(diǎn):

方法的定義和方法調(diào)用都必須同時(shí)顯式使用ref或out,否則會(huì)出現(xiàn)編譯錯(cuò)誤

CLR允許通過out 或ref參數(shù)來實(shí)現(xiàn)方法重載。如:

#region CLR 允許out或ref參數(shù)來實(shí)現(xiàn)方法重載
        private static void Add(string str)
        {
            Console.WriteLine(str);
        }
        // 編譯器會(huì)認(rèn)為下面的方法是另一個(gè)方法,從而實(shí)現(xiàn)方法重載
        private static void Add(ref string str)
        {
            Console.WriteLine(str);
        }
        #endregion

按引用傳遞可以解決由于值傳遞時(shí)改變引用副本而不影響引用本身的問題,此時(shí)傳遞的是引用的引用(也就是地址的地址),而不是引用的拷貝(副本)。下面就具體看看按引用傳遞的代碼:

class Program
    {
        static void Main(string[] args)
        {
            #region 按引用傳遞
            Console.WriteLine("按引用傳遞的情況");
            int num = 1;
            string refStr = "Old string";
            ChangeByValue(ref num);
            Console.WriteLine(num);
            changeByRef(ref refStr);
            Console.WriteLine(refStr);
            #endregion
            Console.Read();
        }
        #region 按引用傳遞
        // 1. 值類型的按引用傳遞情況
        private static void ChangeByValue(ref int numValue)
        {
            numValue = 10;
            Console.WriteLine(numValue);
        }
        // 2. 引用類型的按引用傳遞情況
        private static void changeByRef(ref string numRef)
        {
            numRef = "new string";
            Console.WriteLine(numRef);
        }
        #endregion
}

運(yùn)行結(jié)果為:

全面解析C#中參數(shù)傳遞

從運(yùn)行結(jié)果可以看出,此時(shí)引用本身的值也被改變了,通過下面一張圖來幫忙大家理解下按引用傳遞的方式:

全面解析C#中參數(shù)傳遞

四、總結(jié)

到這里參數(shù)的傳遞所有內(nèi)容就介紹完了??傊?strong>對(duì)于按值傳遞,不管是值類型還是引用類型的按值傳遞,都是傳遞實(shí)參的一個(gè)拷貝,只是值類型時(shí),此時(shí)傳遞的是實(shí)參實(shí)例的一個(gè)拷貝(也就是值類型值的一個(gè)拷貝),而引用類型時(shí),此時(shí)傳遞的實(shí)參引用的副本。對(duì)于按引用傳遞,傳遞的都是參數(shù)地址,也就是實(shí)例的指針。

附件:http://down.51cto.com/data/2363048

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

標(biāo)題名稱:全面解析C#中參數(shù)傳遞-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://aaarwkj.com/article30/ccpdpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站建設(shè)網(wǎng)站維護(hù)、網(wǎng)站建設(shè)企業(yè)網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
欧美伊人久久综合成人网| 黄色录像日本黄色录像| 日韩黄色大片免费在线观看| 日本道二区视频中文字幕| 免费视频观看在线一区二区三区| 风韵犹存丰满大屁股熟妇| 日韩av中文一区二区| 日韩国产一区二区在线观看| 亚洲av男人天堂一区| 亚洲天堂国产中文在线| 精品少妇人妻av不卡久久| 成年人午夜在线观看网址| 日本午夜免费在线视频 | 日本不卡不码高清免费| 日韩一区二区三区无吗电影| 日韩精品国产亚洲欧美| 免费毛片一区二区三区| 欧美日韩亚洲精品三级| 男男啪啪猛进猛出无遮挡| 91久久国产综合久久91| 亚洲午夜激情免费试看| 亚洲不卡高清一区二区三区| 日本熟熟妇丰满人妻啪啪| 免费av男人天堂亚洲天堂| 久久日韩人妻中文字幕| 熟女亚洲一区精品久久| 欧美日韩亚洲精品内裤| 精品三级一区二区三区| 日日做日夜夜操天天搞| 日本韩国一级黄色免费| 久久亚洲女同第一区综合| 午夜在线免费观看小视频| 国产三级精品正在播放| 日本免费一区二区三区等视频| 色综合色综合蘑菇在线| 97久久久人妻精品一区 | 日韩a国产v亚洲欧美精品| 国产精品日本欧美久久久| 国产熟女乱免费一区二区| 中文字幕乱码日韩在线| 国产高清在线不卡一区|