**
昨天在壘**的時候遇到了乙個基礎沒打牢就會暴露的問題。傳遞給方法的引數為類(class)時,在方法中所做的修改賦值不一定會最終改變到原始的變數上。
舉乙個例子,如果乙個方法action(listlst),在方法裡面對lst做了很多操作,包括add,remove,new,add等等。傳入變數listinput,方法執行完之後,input可能被執行了add,remove,但是new以後的任何操作都沒有保留。這是為什麼呢?最開始學習.net基礎的時候就知道,引用型別,傳遞給方法的是引用的位址,而不是實際數值。那為什麼會部分的操作被保留了出來,而部分又沒有執行呢?
用**來分析此案例。
static除錯程式,最後輸出void 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 深度解析 5 函式引數的擴充套件
2 函式佔位引數 3 小結 問題 函式定義中是否可以出現引數的預設值?當宣告和定義中的引數預設值不同會發生什麼?例項分析 預設引數值初探 5 1.c include intmul int x 0 int main int argc,char ar intmul int x 函式 mul 在宣告時指定...
C語言可變引數解析方法
有些函式的引數個數是可變,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的 用三個點 做引數佔位符 實際呼叫時可以有以下的形式 printf d i printf s s print...