非常直截了當。 MSDN指出你可以使用ref,但不能用於部分方法。我只是好奇爲什麼?我的理解是,當編譯代碼時,部分被合併,所以限制是什麼?有更多的partial
比只是使代碼文件更清潔和有組織(即eyecandy)?C#爲什麼部分方法可以使用ref,但不出來?
參考:MSDN Article - 「部分方法可以有ref但不是out參數。」
非常直截了當。 MSDN指出你可以使用ref,但不能用於部分方法。我只是好奇爲什麼?我的理解是,當編譯代碼時,部分被合併,所以限制是什麼?有更多的partial
比只是使代碼文件更清潔和有組織(即eyecandy)?C#爲什麼部分方法可以使用ref,但不出來?
參考:MSDN Article - 「部分方法可以有ref但不是out參數。」
你必須考慮如果部分方法沒有實現會發生什麼。
然後會發生什麼情況是所有對該方法的調用都被剝離出來,就好像它們從未發生過一樣。
所以使用了一種方法,它是這樣的:
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(...);
因爲與ref參數不同,out方法必須在方法返回前初始化。如果部分方法沒有實現(這是一個有效的場景),它如何被初始化?
和未初始化的值類型在c#編譯器中不合法。很好的解釋 – kokabi 2014-12-19 15:49:25
我的猜測是因爲out
參數不需要初始化,而ref
參數。
如果您在部分方法上使用了out
參數,那麼C#如何驗證參數是否已初始化?
一個out
參數表明您想要一個超出該方法的值。如果該方法不存在,則不能提供該值。
另一種方法是將變量的值顯式設置爲其默認值(0,null等)而不是執行方法調用。這樣,變量仍然會被初始化 - 雖然默認值可能不是非常有用的。我相信C#團隊已經考慮到了這一點 - 它甚至可能會將它變成未來的版本,誰知道?我個人懷疑它會特別有用,但可能性在那裏。
目前,您可以始終使用ref
參數,而只是在調用任何默認值之前手動初始化該變量。
我假設的原因是因爲只有簽名的部分方法(即沒有實現)仍然有效。如果您有out參數,則無實現方法總是會導致錯誤(因爲沒有指定out值)
部分方法在部分類中分割。需要一種方法將值分配給OUT參數。部分方法可能會或可能不會實施。這將意味着多個代碼塊試圖將值分配給OUT參數。
正如其他人所說的out
params必須分配。要加上這個會產生編譯器錯誤CS0177ref
另一方面必須在撥打電話之前分配。
很好解釋! – AlwaysAProgrammer 2010-08-10 21:05:37