學過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...