1 概述
根據個人經驗,充分理解out和ref的前提是了解值型別和引用型別的傳遞過程,因此本篇文章先介紹值型別和引用型別,再結束out和ref。
2 值型別和引用型別
2.1 值型別
(1)值型別code
通過值的方式來傳遞,即實際引數向形式引數傳遞(關於形參和實參術語,這裡不定義),主要儲存在棧中。通過值傳遞,copy副本形式,呼叫棧的pop()和push()方法來實現。 常見型別:int,float,bool,enum,struct,array等。
例子:1 //主函式
2 static void main(string args)3 ,n2=", n1, n2);//n1=10,n2=20
8 swap(n1,n2);9 console.writeline("交換後n1和n2的值");10 console.writeline("n1=,n2=",n1,n2);//n1=10,n2=20
11 console.read();12 }13
14 ///
15 ///交換兩個變數的值16 ///
17 /// 形參n1
18 /// 形參n2
19 static private void swap(int t1,intt2)20
(2)值型別分析
以上**,通過值傳遞,交換兩個變數後,並沒有改變n1和n2的值,根本原因是,值傳遞是通過copy副本形式,不改變原值。圖如下:
a.定義變數n1和n2,並初始化變數,在記憶體中的表示大致如下( int n1 = 10, n2 = 20;)
code除錯
在記憶體中表示
b.執行交換變數方法時
code除錯
在記憶體中表示
交換詳細步驟示意圖
2.2 引用型別
(1) 引用型別code
引用型別通過位址來傳遞,如c++中的指標。通俗地講,把位址當作開門的鑰匙即可,主要儲存在堆中。通過位址來傳遞,共享變數,乙個改變,所有改變,常見型別有string,object等。
1 : 定義控制台應用程式的入口點。2 //3
4 #include "stdafx.h"
6 //主函式
7 int _tmain(int argc, _tchar*ar**)8 19 //交換函式
(2)分析
示意圖
3 out和ref
3.1 為什麼引入out和ref
由以上分析可知,值傳遞是無法改變變數的值的,若要像c++一樣,改變變數的值,該怎麼辦?c#引入了out和ref來解決該問題。因此,out和ref均屬於引用型別。
3.2 out詳解
(1)例子
//主函式
static void main(string args)
//out引數
static public int getsum(out int numberfirst,out intnumbersecond)
numberfirst= 10;
numbersecond= 3;return numberfirst +numbersecond;
result:
(2)out特點
a.out只出不進;
b.方法定義和呼叫方法都必須顯示使用out關鍵字(如上**顯然易見);
c.out只出不進,即具有清空方法體外引數功能(如上**,讀者可以任意改變n1和n2的值,只要不改變getsum()方法體,輸出的值均為13);
d.為引用型別(直接呼叫而不事先定義n1和n2,編譯不通過);
e.同名函式,out不與ref同時存在,可以過載;
//如下兩個方法可以過載
public void getnumer(intnum){}public void settime(out int num)
//如下兩個方法不能過載
public void getnumer(ref int num)
public void settime(out int num)
3.3 ref詳解
(1)例子
//主函式
static void main(string args)
//ref引數
static public int refgetsum(ref int numberfirst, ref intnumbersecond)
numberfirst= 10;
numbersecond= 3;return numberfirst +numbersecond;
(2)ref特點
a.有進有出;
b.方法定義和呼叫方法都必須顯示使用ref關鍵字(如上**顯然易見);
c.ref有進有出,即可以把值傳入方法體內(如上**,讀者可以任意改變n1和n2的值);
d.為引用型別(直接呼叫而不事先定義n1和n2,編譯不通過);
e.同名函式,out不與ref同時存在,可以過載;
3.4 out與ref比較
out只輸出,ref有進有出。
4 版權
博主**:
FFT是幹什麼的
fft在演算法競賽中就有乙個用途 加速多項式乘法 暴言 簡單來說,形如 a0x0 a1x1 a2x2 anxna0x0 a1x1 a2x2 anxn 的代數表示式叫做多項式,可以記作f x a0x0 a1x1 a2x2 anxnf x a0x0 a1x1 a2x2 anxn,其中a0,a1,ana0...
npm是幹什麼的
網上的 npm 教程主要都在講怎麼安裝 配置和使用 npm 卻很少告訴新人 npm 是幹什麼的?為什麼要使用 npm?今天我就來講講這個話題。本文目標讀者是 不太了解 npm 的新人 老司機請繞道。社群共享 麻煩npm的思路大概是這樣的 這些可以被使用的 被叫做 包 package 這就是 npm名...
HttpContext是幹什麼的
httpcontext 類.包括說明和如何使用.於是,上網狂搜 有網路就是好啊.這是我補充的httpcontext 類 1.生存週期 從客戶端使用者點選並產生了乙個向伺服器傳送請求開始 伺服器處理完請求並生成返回到客戶端為止.注 針對每個不同使用者的請求,伺服器都會建立乙個新的httpcontext...