進軍到函式

2022-04-04 12:51:21 字數 2315 閱讀 4948

看來簡單的**實現已經不在話下,那我們再來研究一下函式。

那麼差別在**呢?

乙個我們要強調的是,在c#中不存在全域性函式。使用main函式的時候我們知道,所有的函式都是屬於某個具體的類,哪怕是main這樣的函式也是如此。

另乙個就是引數的修飾。回憶一下c 或 c++中的函式引數,我們花了很長時間研究值傳遞和引用傳遞(指標傳遞)的區別。

//值傳遞

void fun1(string s);

//引用/指標傳遞

void fun2(string * ps);

傳參的時候必然要進行copy,值傳遞的時候系統把值copy到乙個區域性變數中,區域性變數在函式結束後會被釋放,所以函式內部對該區域性變數的任何修改都不會對呼叫函式的地方產生影響。

引用傳遞也會進行copy,系統會把傳遞的位址copy到乙個區域性變數中,也就是說,現在,區域性變數和外部變數都是指向同一塊記憶體位址進行操作,對該區域性變數的操作直接影響外部變數。

那麼c#是如何區分的呢。

首先,在c#中沒有指標符號。

string str = new

string('a',10);

這句話建立了乙個由10個a組成的字串物件,返回的其實是乙個指向這塊記憶體位址的指標,只不過c#不再用*來標明了。

再試一下

object o = new object();

stringbuilder sb = new stringbuilder("123");

確實如此。

那沒有*符號如果來區別值傳遞和引用傳遞呢?c#引入了一些引數的修飾符。

//值傳遞

void fun1(string s);

//引用/指標 傳遞

void fun2(ref

string s);

//引用/指標 傳遞

void fun2(out

string s);

值傳遞還是老樣子,引用傳遞c#分出了兩種修飾符,ref就是我們常常用的引用傳遞,呼叫者賦初值,函式內部可以對他進行改變。out更強調這個值是輸出引數,也就是強制要求函式內部必須對這個值進行改變,否則編譯無法通過。

另外,呼叫這些函式的時候,引數的修飾符也同樣要加上。

我們舉個例子來試試吧。先試試看值型別,int

//值傳遞

static

void test1(int i)

//引用傳遞

static

void test2(ref

int i)

//輸出引數

static

void test3(out

int i)

static

void main(string args)

,", i);

test2(ref i);

console.write(",", i);

test3(out i);

console.write("", i);

}函式的輸出結果是0,2,3

正如我們前面所說,值傳遞的時候i=1不能影響外部變數,所以i列印還是0,而其他兩種引用傳遞,對內容的修改會直接影響外部資料,所以列印出來分別是2,3

那再來試試看引用型別stringbuilder吧。

static

void test1(stringbuilder sb)

static

void test2(ref stringbuilder sb)

static

void test3(out stringbuilder sb)

static

void main(string args)

執行的結果是

value in main.pass by value
value in test
value in test
我們來分析一下:第一句 stringbuilder sb = new stringbuilder("value in main. "); 建立了乙個sb物件。前面說了,其實sb是乙個指向sb物件的指標,只不過c#中不用*明確標明了。這樣的話,雖然void test1(stringbuilder sb)是用的值傳遞的方式,但是sb本身就已經是乙個指標,所以對sb的任何修改操作都會體現到外部物件上。因此
推論下來,第二和第三個函式都是引用傳遞,而傳遞的內容又已經是乙個指標,相當與函式傳遞的是指標的指標。這樣我們不僅可以對sb指向的內容做修改,甚至可以對sb物件本身重新定義。這也就是第二第三個函式呼叫結果的原因。

向BI產品進軍

昨天因為找房子的原因,所以沒的背電腦回去,雖然回去已經很晚了,但是由於沒有電腦,總感覺少些什麼東西,又拿起 關於三個企業的思考 這本書看。發現每回看,都會有一些啟發。趟下後,一直在想,利德華福的創業過程非分不容易,到第一台高壓變頻器的生產花了2年時間,到技術比較成熟和銷售穩步上公升,花了4年時間,然...

進軍SharePoint,資料先行

最近計畫學習sharepoint,收集到的部分資料,願與大家共享,希望對大家有用,讓我們共同進步!了解sharepoint sharepoint portal server軟體概述 介紹一下sharepoint 實現sharepoint的無限潛力 wss和sps2003的區別 sharepoint的...

進軍機器學習 序言

我們之所以建模,主要的價值在於 學習統計時,看到各種模型,線性回歸,多元線性回歸,曲線回歸等等,都是為了建模.但是模型是否好呢?我們可以檢視r方,調和r方.機器學習的到來,為統計開啟了另一扇大門.交叉驗證,檢視 準確度.如果說現代統計學是一門循序漸進,系統完善的科學,機器學習則是各種流派,黑貓白貓抓...