技術 C 入門 深度解析方法引數的關鍵字ref

2021-07-27 08:09:19 字數 1971 閱讀 4699

**

昨天在壘**的時候遇到了乙個基礎沒打牢就會暴露的問題。傳遞給方法的引數為類(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...