C 值型別和引用型別的引數傳遞(ref,out)

2021-08-21 07:50:33 字數 1192 閱讀 3954

c#中有兩種型別,值型別,和引用型別。在記憶體中值型別是直接儲存在記憶體的棧中的,引用型別在棧中存放乙個位址,這個位址指向堆中的資料(引用型別的資料是存放在堆中的)

下面我們來看看兩種型別引數傳遞有什麼區別

先看乙個例子

///

///

/// 值型別的引數傳遞

///

class valueparms

public void add1(ref int a)

public void add2(out int a)

class program

else

public void say2(ref person p)

public void say3(out person p)

}public class person

{public string name;

static void main (string args)

classparams p2 = new classparams();

person p = new person();

p.name = "fashi";

p2.say1(p);

console.writeline("main" + p.name); //fashi

p2.say2(ref p);

console.writeline("main" + p.name); //xue

p2.say3(out p);

console.writeline("main" + p.name);//xue

方法裡面的輸出都很容易理解,我們來講一下main方法裡的輸出,第一呼叫沒有引數傳遞的引用型別,main裡面輸出fashi

第二種帶引數的ref 為什麼輸出的是xue,因為呼叫帶ref引數的方法把  p指向的xue的位址賦值給了p指向fashi的位址,所以main裡面輸出的是fashi

第三種帶引數的out的不接收方法裡的引數,並把自己的初始化的位址賦值給了p指向的fashi的位址,所以main裡面輸出的是xue

我們現在來總結一下

*ref,out:傳遞值型別的變數的位址;

* ref:傳遞過程中保留初始值;

* out:傳遞過程中不保留初始值;

* ref:一般需要把外部的值傳入到方法中使用並進行修改;

* out:一般傳遞變數進入某個方法中接收資料;

關於C 值型別,引用型別,值傳遞,引用傳遞

說到引數傳遞,必須得弄清值型別和引用型別 為了容易表達,我暫且命名存放在堆中的內容為堆中物件,存放在棧上的內容為棧中物件。值型別存放在棧中,直接訪問。如果有 int a 0 int b a 就產生了兩個棧中物件。引用型別需要在堆中顯式分配,且不能直接訪問,需要在棧中分配乙個棧中物件 c 叫指標,c ...

C 引數傳遞 引用型別 值型別等的理解

本部落格不屬於技術貼,主要是記錄一些自己對不懂得地方的理解和學習的記錄,請帶著批判的眼光閱讀 值型別儲存在棧上,引用型別儲存在堆上。棧是由高到低儲存的,遵循先進後出的原則,是記憶體提前分配好的區域,記憶體的釋放不由人控制,用完後就會釋放記憶體。堆是動態分配的記憶體區域,是無序的,受人為控制釋放,但是...

C 中值型別和引用型別引數傳遞

原則 盡可能控制對資料的修改,如果可以 某個資料不會或不應該被改變,就要對其控制,而不要期望使用這個資料的呼叫者不會改變其值。如果引數在使用過程中被意外修改,將會帶來不可預知的結果,而且這種錯誤很難被檢查到,所以我們在設計方法引數的時候,要充分考慮傳遞引用型別引數或者引用方式傳遞引用型別引數可能帶來...