c 基礎知識 引數傳遞

2021-08-14 20:01:17 字數 3223 閱讀 7934

當呼叫帶有引數的方法時,您需要向方法傳遞引數。在 c# 中,有三種向方法傳遞引數的方式:

方式描述值引數

這種方式複製引數的實際值給函式的形式引數,實參和形參使用的是兩個不同記憶體中的值。在這種情況下,當形參的值發生改變時,不會影響實參的值,從而保證了實參資料的安全。

引用引數

這種方式複製引數的記憶體位置的引用給形式引數。這意味著,當形參的值發生改變時,同時也改變實參的值。

輸出引數

這種方式可以返回多個值。

這是引數傳遞的預設方式。在這種方式下,當呼叫乙個方法時,會為每個值引數建立乙個新的儲存位置。

實際引數的值會複製給形參,實參和形參使用的是兩個不同記憶體中的值。所以,當形參的值發生改變時,不會影響實參的值,從而保證了實參資料的安全。下面的例項演示了這個概念:

using

system

;namespace

static

void

main

(string

args)"

,a);console

.writeline

("在交換之前,b 的值: ",b

);/* 呼叫函式來交換值 */n.

swap(a

,b);console

.writeline

("在交換之後,a 的值: ",a

);console

.writeline

("在交換之後,b 的值: ",b

);console

.readline

();}}}

當上面的**被編譯和執行時,它會產生下列結果:

在交換之前,

a 的值:

100在交換之前,

b 的值:

200在交換之後,

a 的值:

100在交換之後,

b 的值:

200

結果表明,即使在函式內改變了值,值也沒有發生任何的變化。

引用引數是乙個對變數的記憶體位置的引用。當按引用傳遞引數時,與值引數不同的是,它不會為這些引數建立乙個新的儲存位置。引用引數表示與提供給方法的實際引數具有相同的記憶體位置。

在 c# 中,使用ref關鍵字宣告引用引數。下面的例項演示了這點:

using

system

;namespace

static

void

main

(string

args)"

,a);console

.writeline

("在交換之前,b 的值: ",b

);/* 呼叫函式來交換值 */n.

swap

(refa,

refb

);console

.writeline

("在交換之後,a 的值: ",a

);console

.writeline

("在交換之後,b 的值: ",b

);console

.readline

();}}}

當上面的**被編譯和執行時,它會產生下列結果:

在交換之前,

a 的值:

100在交換之前,

b 的值:

200在交換之後,

a 的值:

200在交換之後,

b 的值:

100

結果表明,swap 函式內的值改變了,且這個改變可以在 main 函式中反映出來。

return 語句可用於只從函式中返回乙個值。但是,可以使用輸出引數來從函式中返回兩個值。輸出引數會把方法輸出的資料賦給自己,其他方面與引用引數相似。

下面的例項演示了這點:

using

system

;namespace

static

void

main

(string

args)"

,a);/* 呼叫函式來獲取值 */n.

getvalue

(outa);

console

.writeline

("在方法呼叫之後,a 的值: ",a

);console

.readline

();}}}

當上面的**被編譯和執行時,它會產生下列結果:

在方法呼叫之前,

a 的值:

100在方法呼叫之後,

a 的值:

5

提供給輸出引數的變數不需要賦值。當需要從乙個引數沒有指定初始值的方法中返回值時,輸出引數特別有用。請看下面的例項,來理解這一點:

using

system

;namespace

static

void

main

(string

args)"

,a);console

.writeline

("在方法呼叫之後,b 的值: ",b

);console

.readline

();}}}

當上面的**被編譯和執行時,它會產生下列結果(取決於使用者輸入):

請輸入第乙個值:

7請輸入第二個值:

8在方法呼叫之後,

a 的值:

7在方法呼叫之後,

b 的值:

8

乙個用關鍵字 ref 標示,乙個用 out 標示。

牽扯到資料是引用型別還是值型別。

一般用這兩個關鍵字你是想呼叫乙個函式將某個值型別的資料通過乙個函式後進行更改。傳 out 定義的引數進去的時候這個引數在函式內部必須初始化。否則是不能進行編譯的。ref 和 out 都是傳遞資料的位址,正因為傳了位址,才能對源資料進行修改。

一般情況下不加 ref 或者 out 的時候,傳值型別的資料進去實際上傳進去的是源資料的乙個副本,也就是在記憶體中新開闢了一塊空間,這裡面存的值是與源資料相等的,這也就是為什麼在傳值型別資料的時候你如果不用 return 是無法修改原值的原因。但是你如果用了 ref,或者 out,這一切問題都解決了,因為他們傳的是位址。

out 比起 ref 來說,還有乙個用法就是可以作為多返回值來用,都知道函式只能有乙個返回值,c#裡,如果你想讓乙個函式有多個返回值,那麼out能很容易解決。

C 基礎知識

抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...

c 基礎知識

或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....

C 基礎知識

1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...