詳細介紹C#中out和ref的區別(圖文)

來源:互聯網
上載者:User
本文主要介紹了out和ref的相關知識。具有一定的參考價值,下面跟著小編一起來看下吧

要想充分理解C# out和ref,必須先明確如下兩個概念(對實值型別與參考型別掌握比較好的,可以跳過“一、明確兩個基本概念”

一、明確兩個基本概念

實值型別:

定義:通過值的方式來傳遞,即實際參數向形式參數傳遞(關於形參和實參術語,這裡不定義)。

儲存方式:主要在棧中。

本質:通過值傳遞,copy副本形式,調用棧的Pop()和Push()方法來實現。

常見類型:int,float,bool,enum,struct,Array等。

實值型別例子:

//主函數 static void Main(string[] args) {  //定義兩個實參n1和n2,並初始化  int n1 = 10, n2 = 20;  Console.WriteLine("交換前n1和n2的值");  Console.WriteLine("n1={0},n2={1}", n1, n2);//n1=10,n2=20  Swap(n1,n2);  Console.WriteLine("交換後n1和n2的值");  Console.WriteLine("n1={0},n2={1}",n1,n2);//n1=10,n2=20  Console.Read(); } /// <summary> /// 交換兩個變數的值 /// </summary> /// <param name="n1">形參n1</param> /// <param name="n2">形參n2</param> static private void Swap(int t1,int t2) {  int temp;  temp =t1;  t1 =t2;  t2 = temp; }

分析:以上代碼,通過值傳遞,交換兩個變數後,並沒有改變n1和n2的值,根本原因是,值傳遞是通過copy副本形式,不改變原值。圖如下:

1)定義變數n1和n2,並初始設定變數,在記憶體中的表示大致如下( int n1 = 10, n2 = 20;)

Code調試

在記憶體中表示

2)執行交換變數方法時

Code調試

在記憶體中表示

交換詳細步驟

參考型別:

定義:通過地址來傳遞,如c++中的指標。通俗地講,把地址當作開門的鑰匙即可。

儲存方式:主要儲存在堆中。

本質:通過地址來傳遞,共用變數,一個改變,所有改變。

常見類型:String,Object等。

code:c++

// Cpplus.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"//主函數int _tmain(int argc, _TCHAR* argv[]){ void Swap(int *x, int *y); int n1 = 10, n2 = 20; printf("交換前n1和n2的值\n"); printf("%d,%d\n", n1, n2); Swap(&n1,&n2); printf("交換後n1和n2的值\n"); printf("%d,%d",n1,n2); getchar(); return 0;}//交換函數void Swap(int *x, int *y){ int temp = *x; *x = *y; *y = temp;}

result:

調試

二、為什麼引入out和ref

由以上分析可知,值傳遞是無法改變變數的值的,若要像c++一樣,改變變數的值,該怎麼辦?c#引入了out和ref來解決該問題。因此,out和ref均屬於參考型別。

二、out詳解

一句話概括之:out只進不出。


//主函數 static void Main(string[] args) {  int n1, n2;  Console.WriteLine(GetSum(out n1,out n2));  Console.Read(); } //out參數 static public int GetSum(out int numberFirst,out int numberSecond) {  numberFirst = 10;  numberSecond = 3;  return numberFirst + numberSecond; }

result:

out特點:

1、方法定義和調用方法都必須顯示使用out關鍵字。(如上代碼顯然易見)

2、out只出不進,即具有清空方法體外參數功能。(如上代碼,讀者可以任意改變n1和n2的值,只要不改變GetSum()方法體,輸出的值均為13)

3、為參考型別。(直接調用而不事先定義n1和n2,編譯不通過)

4、同名函數,out不與ref同時存在,可以重載。

//如下兩個方法可以重載public void getNumer(int num){}public void setTime(out int num){num=10;}//如下兩個方法不能重載public void getNumer(ref int num){num=10;}public void setTime(out int num){num=10;}

三、ref詳解

一句話概括之:有進有出。

//主函數 static void Main(string[] args) {  int n1=1, n2=3;  Console.WriteLine(refGetSum(ref n1,ref n2));  Console.Read(); }  //ref參數 static public int refGetSum(ref int numberFirst, ref int numberSecond) {  numberFirst = 10;  numberSecond = 3;  return numberFirst + numberSecond; }

ref特點:

1、方法定義和調用方法都必須顯示使用ref關鍵字。(如上代碼顯然易見)

2、ref有進有出,即可以把值傳入方法體內。(如上代碼,讀者可以任意改變n1和n2的值)

3、為參考型別。(直接調用而不事先定義n1和n2,編譯不通過)

4、同名函數,out不與ref同時存在,可以重載。

四、out與ref異同

主要區別,out只輸出yuan'chuang,ref有進有出。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.