C 引用傳遞

2021-07-07 06:09:35 字數 3369 閱讀 3012

學過c#的人都知道,通過或通過引用,值型別和引用型別都可以作為方法引數傳遞。在c#中,不管是值型別或者是引用型別,所有方法引數在預設情況下是通過值傳遞的。

1)通過值傳遞值型別

在通過值傳遞作為方法引數的變數時,傳遞給方法的是資料副本。在方法中對該資料的任何修改都不會對初始值有任何影響

c#如下**:

[csharp]view plain

copy

using

system;  

class

myexecutableclass  

static

void

dosomething(

intparameter)  

}  

程式的輸出為50.也許你會感到奇怪,為什麼不是100呢?因為變數value是通過值而不是引用傳遞的。我們不需要新增任何特殊的關鍵字,而是依賴於c#的預設行為,通過值傳遞值型別。

2)通過引用傳遞值型別

通過引用傳遞值型別,也就是說傳遞值(變數)的引用。如果傳遞引用的話,那麼無論在程式的什麼地方作改變的話(可能是在另乙個方法、屬性中,甚至是另乙個物件中),都會改變使用改引用的值。對方法中任何引數的改變都將影響方法的返回值。

在c#中,通過引用傳遞是通過ref關鍵字實現的,必須按如下所示將ref關鍵字新增到方法定義中:

static void dosomething(ref intparameter)

傳遞引數時,必須使用ref關鍵字。

dosomething(ref value)

下面的**演示了如何對值型別使用ref關鍵字:

[csharp]view plain

copy

using

system;  

class

myexecutableclass  

static

void

dosomething(

refint

parameter)  

}  結果正如你所料,輸出為100.

3)通過值傳遞

引用型別

一般來說,通過值傳遞意味著傳遞儲存在棧中的值。對於引用型別來說,儲存在棧上的值表示對

記憶體中物件實際位置的引用。因此,如果通過值傳遞引用型別,就意味著傳遞的是物件的引用(它的堆疊)

.使用該引用作的改變最終會改變堆中的同一物件。

通過值傳遞引用型別不像通過值傳遞值型別---它更像通過引用傳遞值型別。在如下**中,

我們將person用作引用型別。

[csharp]view plain

copy

using

system;  

class

myexecutableclass  

static

void

dosomething(person someperson)  

}  class

person  

}   

執行程式,可以發現輸出值為100.

如果對dosometing方法作如下修改;

[csharp]view plain

copy

static

void

dosomething(person someperson)    

重新執行程式,發現輸出為50.這是因為我們並沒有將引用傳遞給方法?

答案是:不,我們確實傳送了引用。引用型別有兩個元素---引用和物件。現在,在

呼叫dosomething()方法時,我們建立了乙個引用副本,它仍然指向同一物件,因此,對物件的改變會影響主程式。而對引用的改變則不會,在方法結束時,消失的只是引用的副本。

1。在使用someperson.age屬性改變年齡時,我們改變的是物件

2。但接下來是建立乙個新物件,改變引用來指向它---對引用的改變將會丟失。

應該怎麼做呢?方案就是通過引用傳遞引用型別,那樣作的話,如果改變someperson所儲存的引用,那麼另乙個「父」引用會自動更新。聽起來很混亂,下面再討論。

4) 通過引用傳遞引用型別

我們知道,在通過值傳遞引用型別時,我們傳遞對記憶體中物件位置的引用。而通過引用傳遞引用型別時,我們將傳遞引用的引用。

正如我們所看到的,通過值傳遞引用型別並不適合於所有情況---特別是需要改變引用以指向新物件時。

下面例子就是說明通過引用傳遞就很有用。

[html]view plain

copy

<

prename

="code"

class

="csharp"

>

pre>

<

prename

="code"

class

="csharp"

>

using system;  

class myexecutableclass  

static void dosometing(ref person someperson)  

pre>

<

prename

="code"

class

="csharp"

>

} pre

>

<

pre>

pre>

這次輸出為100;person變數實際上對堆上person物件的引用。在呼叫dosomething()時,編譯器建立了對person引用的引用(而不是對person物件的引用).在dosometing()方法中,someperson是person引用的引用,而person引用堆上的物件。然而,dosomething()知道值是通過引用傳遞的,因此對someperson的任何改變實際上是改變了person。結果就是someperson的行為就好像它是person引用,而不是其副本。

C 引用傳遞

學過c 的人都知道,通過值或通過引用,值型別和引用型別都可以作為方法引數傳遞。在c 中,不管是值型別或者是引用型別,所有方法引數在預設情況下是通過值傳遞的。1 通過值傳遞值型別 在通過值傳遞作為方法引數的變數時,傳遞給方法的是資料副本。在方法中對該資料的任何修改都不會對初始值有任何影響。c 如下 u...

C 引用傳遞

以前對引用傳遞一知半解,尤其是 符號。現在做一下梳理。get idea from here.先來看下 alias int i 5 int j i j is an alias to i j 5 這裡 j 就是 i 這個變數的另乙個名字。所以這個物件現在有兩個名字 i 和 j.現在就好理解引用傳遞了。用...

c 值傳遞 位址傳遞 引用傳遞

一.函式引數傳遞方式之一 值傳遞 1 值傳遞的乙個錯誤認識 先看題一中exchg1函式的定義 void exchg1 int x,int y 定義中的x,y變數被稱為exchg1函式的形式引數 問 你認為這個函式是在做什麼呀?答 好像是對引數x,y的值對調吧?請往下看,我想利用這個函式來完成對a,b...