簡體   English   中英

為什么我必須在 C# 中指定“out”關鍵字?

[英]Why do I have to specify the “out” keyword in C#?

在我問我的問題之前,請看一下這個例子 function:

DateTime.TryParse("01/01/2000", out oDate)

為什么我需要指定out關鍵字? 編譯器不應該從函數的定義中知道這一點嗎?

我純粹出於好奇而問這個問題,希望我能學到一些關於編譯器的新東西。

我還應該澄清一下,我特別詢問的是 C# .NET 3.5 編譯器。

編譯器可能暗示 out 關鍵字,但我的理解是 C# 團隊決定讓 function 的調用者明確要求out關鍵字,以增加對參數性質的可見性。

編譯器知道,你可能不知道。 這是一種讓您知道您傳遞的參數可以在您傳遞給它的 function 中更改的方式。

這不是關於編譯器知道什么,而是確保開發人員意識到這個調用可以並且將會改變變量 X 的值。

其中很多都源於 C++,其中參考值不需要呼叫站點監視器。 查看 C++ 調用並確切知道它會做什么是不可能的。 C++中通過引用和值傳遞的參數在語義上有很大的不同。

是的,編譯器可以弄清楚,但是這樣你就知道它會修改你傳入的變量。

C# 語言有很多我稱之為安全網的東西,它們明確地告訴程序員發生了什么。 幾個例子是:

  1. 在 switch 語句中不會失敗。
  2. 您不能在 if 語句中賦值:if(x = 5) 會拋出錯誤而不是評估為真。

http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.80).aspx

"out 關鍵字導致 arguments 通過引用傳遞。這與 ref 關鍵字類似,只是 ref 要求在傳遞之前初始化變量。要使用 out 參數,方法定義和調用方法都必須顯式使用out 關鍵字。”

由於 DateTime.TryParse 不需要初始化 oDate,因此您必須傳遞 out 關鍵字。

好的,我不是 C# 專家,所以如果我搞砸了,有人請糾正我嗎?

將參數傳遞給 C# function 有兩種方法:通過值和通過引用。 這里最大的區別是修改function里面的參數是否修改了用來調用它的變量。 這不是我相信編譯器自己決定的事情。

由於您希望 oDate 是從調用者傳入的變量,並且已更改,因此您希望它通過引用傳遞。

另一個問題是它是否應該被初始化。 C# 喜歡在未初始化的情況下使用變量,因為這幾乎總是一個錯誤。 在這種情況下,您可能只需聲明您傳入的內容,並使用 TryParse() 為其賦予第一個值。 這是一個完全合法的技術,所以編譯器應該允許它。 這是另一件事我不相信編譯器會正確。 (我假設編譯器還會檢查以確保在 TryParse() 中使用之前初始化 out 參數。)

所以,“出”有兩個目的。 它確定參數是通過引用傳入的,並且預計將在 function 內部進行初始化。 這些都不能由編譯器確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM