引用傳遞的引數型別,加不加ref是不同的

2021-06-01 17:44:27 字數 1615 閱讀 1988

教科書上說引用傳遞的引數引用時,加不加ref都可以,都會改變引數原來的值,值傳遞引數引用時如果想要改變原來的值,必須加ref。以前遇到的大部分情況確實是如此,引用傳遞型別比如arraylist,datatable到另乙個方法中,並在該方法中改變引數值,原呼叫方法處的變數確實改變了。但是今天遇到乙個問題,引用的datatable如果不加ref關鍵字,呼叫方法改變其值後卻不變,而加上ref關鍵字後改值卻變了,示例**如下: 

private void button1_click(object sender, system.eventargs e)  

private void changearray( datatable dtref)

加上ref關鍵字後:

private void button1_click(object sender, system.eventargs e)  

private void changearray( ref datatable dtref)

更奇怪的是,如下呼叫方法,無論加不加ref都是可以改變值的:

private void button1_click(object sender, system.eventargs e)

private void changearray( datatable dtref)

百思不得其解,查了很多資料,基本上都是認為引用傳遞型別加不加ref都是一樣的,可以目前發現的問題是明明不一樣。後來網上搜到了遇到同一問題的帖子,雖然沒有對該現象權威的解釋,但是基本明白了出現問題的根源。

傳遞引用 和傳遞 ref 引用的區別,是第乙個傳遞指標,第二個是傳遞指向指標的指標,所以第乙個可以修改那個指標指向的內容,但不能修改指標本身的位址,第二個則可以修改指標位址

傳遞引用 和傳遞 ref 引用的區別,學過c++的話應該很好理解.

就是指標(*)和引用(&)的區別.

void mothod(datatable dt) 傳遞的是dt變數所指向的記憶體空間

void mothod(ref datatable dt) 傳遞的是dt變數本身的記憶體位址

這裡可能是作用域的問題

在changearray方法裡面如果不使用dt=new datatable()語句,則在changearray中處理dt,button1_click裡的dt都會變化,

因為button1_click()裡的dt和changearray裡的dt是datatable類的同乙個例項,只是在changearray中改變了它的值,作用域在button1_click()中沒有發生變化。

如果在changearray中有dt=new datatable()語句,相當於重新定義datatable類的新例項,此dt已非彼dt,

dt的作用域此時只在changearray中有效,也就是說changearray中的dt根本和button1_click裡面的dt已不是同乙個例項,在changearray裡面根本就沒有對button1_click()裡面的dt做任何改變。

所以可以預見的語句:dtref = dtlist.copy();對dtref 進行了重新初始化處理,所以如果不加ref時,dtref就被重新定義了,dtref所指向的位址與原dt不同了。如果加上ref引用時,因為傳遞的變數所在的位址,dtref雖然重新定義了,不管其變數位址指向**,因為傳遞了dt的所在位址,其值仍然是可以得到的。

值傳遞與引用傳遞 引數型別

根據儲存方式不同,我們將資料型別分為值型別和引用型別。值型別 基本資料型別 int float double boolean long 列舉 結構。儲存在棧當中的,提取資料快,但是分配空間多,耗資源,建議資料量少的情況下使用。引用型別 object型別 類 陣列 介面 值傳遞 1 直接傳遞值型別 結...

JS基礎 引用型別的引數傳遞

ecmascript中所有函式的引數都是按值傳遞的。可以把ecmascript函式的引數想象成區域性變數。ecmascript中所有函式的引數都是按值傳遞的。也就是說,函式的傳參,就和基本型別變數的複製一樣,而引用型別值的傳遞,則如同引用型別變數的複製一樣。這裡可能會使很多人感到困惑,因為訪問變數有...

C 中值型別和引用型別引數傳遞

原則 盡可能控制對資料的修改,如果可以 某個資料不會或不應該被改變,就要對其控制,而不要期望使用這個資料的呼叫者不會改變其值。如果引數在使用過程中被意外修改,將會帶來不可預知的結果,而且這種錯誤很難被檢查到,所以我們在設計方法引數的時候,要充分考慮傳遞引用型別引數或者引用方式傳遞引用型別引數可能帶來...