2010-08-10 9 views
19

非常直截了當。 MSDN指出你可以使用ref,但不能用於部分方法。我只是好奇爲什麼?我的理解是,當編譯代碼時,部分被合併,所以限制是什麼?有更多的partial比只是使代碼文件更清潔和有組織(即eyecandy)?C#爲什麼部分方法可以使用ref,但不出來?

參考:MSDN Article - 「部分方法可以有ref但不是out參數。」

回答

20

你必須考慮如果部分方法沒有實現會發生什麼。

然後會發生什麼情況是所有對該方法的調用都被剝離出來,就好像它們從未發生過一樣。

所以使用了一種方法,它是這樣的:

stream s; 
s.Write(...); 

此代碼是不允許的,因爲s一直沒有:

stream s; 
GetStream(out s); 
s.Write(...); 

並且雖然它說,這個編譯初始化。保證變量在您嘗試調用Write方法時被初始化,並與GetStream的調用聯繫起來。

這與返回數據的方法是一樣的。由於如果您尚未實現partial方法,整個方法調用只是未編譯,所以您需要考慮可以做什麼以及不可以做什麼,並且仍然保留稱它爲有效的代碼。根據out和返回值,它有可能導致調用代碼無效或不完整,因此不允許。

至於ref,這是有效的,因爲在初始化已經由調用代碼的照顧:

stream s = null; 
GetStream(ref s); // may be stripped out 
if (s != null) 
    s.Write(...); 
+2

很好解釋! – AlwaysAProgrammer 2010-08-10 21:05:37

9

因爲與ref參數不同,out方法必須在方法返回前初始化。如果部分方法沒有實現(這是一個有效的場景),它如何被初始化?

+0

和未初始化的值類型在c#編譯器中不合法。很好的解釋 – kokabi 2014-12-19 15:49:25

4

我的猜測是因爲out參數不需要初始化,而ref參數。

如果您在部分方法上使用了out參數,那麼C#如何驗證參數是否已初始化?

4

一個out參數表明您想要一個超出該方法的值。如果該方法不存在,則不能提供該值。

另一種方法是將變量的值顯式設置爲其默認值(0,null等)而不是執行方法調用。這樣,變量仍然會被初始化 - 雖然默認值可能不是非常有用的。我相信C#團隊已經考慮到了這一點 - 它甚至可能會將它變成未來的版本,誰知道?我個人懷疑它會特別有用,但可能性在那裏。

目前,您可以始終使用ref參數,而只是在調用任何默認值之前手動初始化該變量。

1

我假設的原因是因爲只有簽名的部分方法(即沒有實現)仍然有效。如果您有out參數,則無實現方法總是會導致錯誤(因爲沒有指定out值)

1

部分方法在部分類中分割。需要一種方法將值分配給OUT參數。部分方法可能會或可能不會實施。這將意味着多個代碼塊試圖將值分配給OUT參數。

1

正如其他人所說的out params必須分配。要加上這個會產生編譯器錯誤CS0177ref另一方面必須在撥打電話之前分配。

相關問題