向方法傳遞結構和向方法傳遞引用之間的區別 總結

2022-02-25 09:32:17 字數 1845 閱讀 7881

向方法傳遞結構中(值型別變數)和向方法傳遞類中(引用型別變數)之間的區別

案列分析:

class

program

//宣告乙個結構

struct

thestruct

//乙個用於測試的類

class

testclass_struct

", c.willichange);

}//用於測試結構的方法

static

void

structtaker(thestruct s)

", s.willichange);

}//main函式

static

void

main()

", testclass.willichange);

console.writeline(

"向方法structtaker傳遞例項前=

", teststruct.willichange);

console.writeline();

classtaker(testclass);

structtaker(teststruct);

console.writeline(

"呼叫方法classtaker方法後=

", testclass.willichange);

console.writeline(

"呼叫方法structtaker方法後=

", teststruct.willichange);

"structtaker(teststruct)=", structtaker(teststruct));

//報錯

//structtaker方法是void型別,不能返回方法執行後的值。所以teststruct.willichange還是上海

console.readkey();

/*a簡單說明:

在向方法傳遞結構時,傳遞的是該結構的副本,而在傳遞類例項時,傳遞的是乙個引用。

輸出結果表明:當向 classtaker 方法傳遞類例項時,只更改類字段的值。但是向 structtaker 方法傳遞結構例項並不更改結構字段。這是因為向 structtaker 方法傳遞的是結構的副本,而向 classtaker 方法傳遞的是對類的引用。

*//*

b深入理解:記憶體中堆和棧的概念。

概念準備:

1變數,用於儲存資料。每個變數在記憶體中分配一小塊儲存空間,每個變數都有乙個型別,型別決定分配記憶體的大小,也決定什麼值可以儲存在變數中。

2在c#中,在類或結構中定義的變數叫字段,在方法中定義的變數就叫變數。作用域不同:全域性和非全域性。字段概念是變數概念的子集。

下面我們統一叫變數吧。

一、向方法傳遞類中例項時,傳遞的是變數的引用。

解釋:1變數的引用位於棧中,變數的實際值位於堆中;

2引用存放的是變數位於堆中的位址,通過棧中的引用可以尋找到堆中變數的實際值。

(這樣,儲存的資料相同僅名稱不同的變數時,使用相同的引用,可以大大減少記憶體消耗)

3如果修改了變數的引用,就尋找不到堆中的實際值了。

4垃圾**器會對堆中無物件引用的實際值進行**,以減少記憶體堆消耗。

所以:即便是呼叫的方法無返回值,變數的實際值還是會改變。

二、 向方法傳遞結構中例項時,傳遞的是變數的副本。

解釋:2傳遞變數時,把變數的實際值複製乙份傳遞過去,相當於相同的資料放到了兩個不同的地方。

3對另乙個作用域的變數的實際值修改時,並不會影響本作用域相同名稱的變數的實際值。

所以:呼叫的方法無返回值,變數的實際值不會改變。

*///如有錯誤請立即指出,謝謝。

} }

}

向指令碼傳遞引數

start 在需要的時候我們可以向 perl 指令碼傳遞引數,perl 會自動將所有的引數放到陣列 argv 中,下面是乙個簡單的例子。usr bin perl use strict if argv 1 my name argv print welcome name n unix 的 cat 命令可...

向Fragment傳遞資料

fragment由activity託管,當啟動這個activity並且想顯示fragment時,幾乎都需要向fragment傳遞乙個或幾個資料,而fragment則根據傳遞過來的這幾個引數顯示不同的畫面。下面就是介紹如何向fragment傳遞資料。當不需要傳遞資料時 activity類裡 fragm...

向指令碼傳遞引數

1.使用 pg opt.sh bin sh opt.sh usage opt 1 processid 1 if ne 2 then usage exit 1 ficase opt in start start echo starting.processid stop stop echo stoppi...