向方法傳遞結構中(值型別變數)和向方法傳遞類中(引用型別變數)之間的區別
案列分析:
classprogram
//宣告乙個結構
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...