昨天在壘**的時候遇到了乙個基礎沒打牢就會暴露的問題。傳遞給方法的引數為類(class)時,在方法中所做的修改賦值不一定會最終改變到原始的變數上。
舉乙個例子,如果乙個方法action(listlst),在方法裡面對lst做了很多操作,包括add,remove,new,add等等。傳入變數listinput,方法執行完之後,input可能被執行了add,remove,但是new以後的任何操作都沒有保留。這是為什麼呢?最開始學習.net基礎的時候就知道,引用型別,傳遞給方法的是引用的位址,而不是實際數值。那為什麼會部分的操作被保留了出來,而部分又沒有執行呢?
用**來分析此案例。
staticvoid main(string
args)
; list
reflist = new list() ;
teststruct(i);
testrefstruct(
refrefi);
testclass(list);
testrefclass(
refreflist);
console.writeline(
"i: \r\nrefi: \r\nlist: \r\nreflist:
", i, refi,
list.select(x => x.tostring()).aggregate((x, y) => x + "
," +y),
reflist.select(x => x.tostring()).aggregate((x, y) => x + "
," +y));
console.readkey();
}static
void teststruct(int
input)
static
void testrefstruct(ref
intinput)
static
void testclass(listinput)
static
void testrefclass(ref listinput)
除錯程式,最後輸出
i: 0
refi: 10
list: 0,1,2,5
reflist: 10
在函式teststruct中,傳入乙個值型別的引數,沒有對傳遞進去的引數i做任何的修改。
在函式testrefstruct中,傳入值型別的引數,通過引用傳遞引數ref,函式中對input進行的任何改變都影響到了refi上,所做的編輯修改全部保留過來。最終refi的值為10。
在函式testclass中,傳入乙個引用型別的引數,在函式中,對input重新賦值之前所做的修改都保留了下來,影響了list的值。而在對input重新賦值之後的所有修改編輯,都和list沒有任何關聯了。
在函式testrefclass中,傳入乙個引用型別的引數,同時,引數前面加上ref的約束,函式中,對input進行的任何編輯都影響了reflist。最終reflist的值為new list。
有一定.net基礎的人都可以很清晰的理解第
一、二和第四種情況。但是第三種情況常常會給我們留下陷阱。
如何理解和正確的對待函式傳遞的引數為引用型別的情況?我的理解是:第三種情況下,傳遞給函式的變數a提供的是乙個引用位址,函式會自動生成乙個變數b,同時用傳遞進來的引用位址對這個變數b賦值,這時,傳遞進來的變數a和函式內呼叫的變數b共乙個引用位址,所做的修改會同步的影響另乙個引數。如果在函式內部,出現了乙個input = new list();的語句。這時,變數b會重新賦值到另乙個引用位址。那麼,從此之後,變數b與變數a再沒有關聯,對變數b所做的任何修改將不影響變數a。
下面模擬**呈現。
list a = new list() ;//傳遞給函式的變數。
//出函式,b釋放,a繼續存在。
個人理解。如果不足請補充。
技術 C 入門 深度解析方法引數的關鍵字ref
昨天在壘 的時候遇到了乙個基礎沒打牢就會暴露的問題。傳遞給方法的引數為類 class 時,在方法中所做的修改賦值不一定會最終改變到原始的變數上。舉乙個例子,如果乙個方法action listlst 在方法裡面對lst做了很多操作,包括add,remove,new,add等等。傳入變數listinpu...
C 關鍵字 方法引數
printed from microsoft.docs 使用params關鍵字可以指定採用數目可變的引數的方法引數。可以傳送引數宣告中所指定型別的逗號分隔的引數列表或指定型別的引數陣列。還可以不傳送引數。如果未傳送任何引數,則params列表的長度為零。在方法宣告中的params關鍵字之後不允許有任...
C 方法的引數關鍵字 ref out params
c 方法的引數關鍵字 ref out params?usingsystem namespace方法的引數傳遞機制 引用引數 ref ref在使用前需要先初始化變數的值,在方法體外先初始化。publicstaticvoidrefmethod refinti 輸出引數 out out引數必須在方法體內初...