程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 全面解析C#中參數傳遞

全面解析C#中參數傳遞

編輯:C#入門知識

一、引言

  對於一些初學者(包括工作幾年的人在內)來說,有時候對於方法之間的參數傳遞的問題感覺比較困惑的,因為之前在面試的過程也經常遇到參數傳遞的基礎面試題,這樣的面試題主要考察的開發人員基礎是否扎實,對於C#中值類型和引用類型有沒有深入的一個理解——這個說的理解並不是簡單的對它們簡單一個定義描述,而在於它們在內存中分布。所以本文章將帶領大家深入剖析下C#中參數傳遞的問題,並分享我自己的一個理解,只有你深入理解了才能在不運行程序的情況就可以分析出參數傳遞的結果的。

二、按值傳遞

對於C#中的參數傳遞,根據參數的類型可以分為四類:

  • 值類型參數的按值傳遞
  • 引用類型參數的按值傳遞
  • 值類型參數的按引用傳遞
  • 引用類型參數的按引用傳遞

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

2.1 值類型參數的按值傳遞

對於參數又分為:形參和實參,形參指的是被調用方法中的參數,實參指的是調用方法的參數,下面結合代碼幫助大家理解形參和實參的概念:

  Main( addNum = 

           Add(= addnum + 

,為了證明這點,看看下面的代碼和運行結果就明白了:

   Main(
            Console.WriteLine( addNum = 
           Add(= addnum + 

運行結果為:

從結果中可以看出addNum調用方法之後它的值並沒有改變,Add 方法的調用只是改變了addNum的副本addnum的值,所以addnum的值修改為2了。然而我們的分析到這裡並沒有結束,為了讓大家深入理解傳遞傳遞,我們有必要知道為什麼值類型參數的按值傳遞不會修改實參的值,相信下面這張圖可以解釋你所有的疑惑:

  Main(
            RefClass refClass = 
          +=   addnum=

運行結果為:

為什麼此時傳遞引用就會修改原來實參中的值呢?對於這點我們還是參數在內存中分布圖來解釋下:

運行結果為:

對於為什麼原來的值沒有被改變主要。所以運行結果才會像上面這樣,下面內存分布圖可以幫助你更形象地理解文字表述:

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

   Main( 按引用傳遞 num =  refStr =   按引用傳遞
        
           ChangeByValue( = 
           changeByRef( = 

運行結果為:

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

四、總結

到這裡參數的傳遞所有內容就介紹完了。總之,

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved