c 中out和ref有區別麼?

時間 2021-05-30 23:29:19

1樓:靈魂對撞機

看樣子你沒有學過c語言,玩過指標的很容易明白ref out代表的啥。區別真的大,用out還是ref決定了方法和呼叫時的寫法,核心還是不變,指標

2樓:打玻璃

out:你必須先初始化,才能讀取他的值。他告訴編譯器,這個變數會在function內被賦值。

ref:在進入這個方法之前就要被初始化,並且有值。在方法內你可以讀取這個值,也可以改變他的值。

outref在方法內都可以讀取和改變他的值,但是ref 在方法外就要進行初始化,而 out可以在方法內進行初始化。

3樓:羊牮

語義不同。IL裡只有 ref,如果你要寫這樣的過載:

public

void

Foo(

refint

value

)public

void

Foo(

outint

value

)是注定失敗的。C# 只是在 ref 前面加了[Out] 批註來解決:變數的初始化,應該由呼叫方負責還是實現方來負責的分歧。

4樓:ijrys

這倆都是引用,實現上肯定是指標,區別在於語義

ref是引用,你在函式內可能會獲取值,可能會賦值,c#要求變數在使用前必須要初始化,ref修飾的變數在傳參前就必須要先初始化

out是輸出,為了解決早年c#沒有元組的多返回值尷尬,他在語義上是離開函式時一定會被賦值,那麼在傳參之前變數不必初始化,在函式內一定要賦值,保證語義正確

5樓:無以言

out 你就直接念輸出或者匯出。

後面的變數就當是乙個坑,你輸出的東西會直接塞到那個坑里。

ref 坑里有東西,整個坑都給你,隨你折騰

6樓:

我好像沒理解題主的意思,我回答的是ref和out的區別。題主可能是不了解ref和out本身,而不是不清楚兩者的區別。可以先了解一下這兩個關鍵字,然後再參考一下這個回答。

out要求方法內必須對該引數賦值,且允許呼叫時傳入的引數可以沒有賦值過。可以看以下例子:

static

void

MethodA

(out

intnumber

)static

void

MethodB

(out

intnumber

)static

void

Main

(string

args

)而ref不要求方法內必須賦值,且要求呼叫時必須有賦值。

static

void

MethodA

(ref

intnumber

)static

void

Main

(string

args

)也就是說,out其實可以被視為增加乙個返回值;但是ref或許可以視為在這兩個方法間存在的乙個全域性變數。兩者表達的意思是完全不同的,怎麼可以就這樣換掉呢?

7樓:

Unity中的Raycast函式過載中只有out的,使用ref會導致找不到與之匹配的版本。這個是很基礎的C#知識。

docs.unity3d.com/ScriptReference/Physics.Raycast.html所以應該這樣寫

RaycastHit

hit;if(

Physics

.Raycast

(ray

,out

hit))

或者if

(Physics

.Raycast

(ray

,out

RaycastHit

hit))

ref和out都是按引用傳遞,但是ref要求傳遞前必須初始化,具體的可以看下面兩個鏈結有具體說明

ref keyword - C# Referenceout keyword - C# Reference

C 中endl和 n有何區別?

Michael.Liu endl 表示輸出換換行符,並重新整理緩衝區 n 表示換行的轉義字元 cout endl 等價於 cout n flush Don t useendlexcept possibly for aesthetic reasonsBjarne Stroustrup 今天被這兩個東西...

在C 中 String Empty和 有什麼區別?

Ken.W 這類問題去stackoverflow問效果更好 榮浩 String.Empty是String類裡已經例項化好的靜態唯讀空字串,我們可以直接拿來用。而對於 系統需要去託管堆上例項化乙個空字串,效能略差一些吧 這種說法是錯誤的!Strings1 String Empty Strings2 C...

C 中 int a 和 int a 有什麼區別?

楊喚晨 做形參的時候,int a與int a無任何區別。眾所周知,陣列名本身就是指標 如果宣告乙個int a 5 那麼a就是乙個指標。既然無區別,為什麼還要設定兩種形參呢?顯然,這是考慮到了程式的可讀性。如果你希望傳遞陣列,就用前者 如果只是單純地想傳遞指標,就用後者 int a 和 int a 在...