2011-08-05 59 views
5

我已經看到了與AD in this stackoverflow question困惑與C#「使用」

我越來越感到困惑using語句工作的一些代碼。我認爲它只是用來事情,你擔心可能成爲內存泄漏,就像一個Web客戶端,或類似的...

總之:

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
     using (var user = UserPrincipal.FindByIdentity(context, "username")) 
     { 
      var groups = user.GetAuthorizationGroups(); 
      ... 
     } 
} 

當我到達行var groups = user.GetAuthorizationGroups() - 用戶爲空,因此該行失敗並帶有NullReference。當我將鼠標移到它上面時,調試它顯示爲空,然後顯示靜態成員,並具有所有值。

如果我從使用聲明中刪除該行,並且只是根據需要填充了var user = UserPrincipal.FindByIdentity(context, "username")用戶。

所以發生了什麼?

編輯:我塞滿了,併發送了一個假的用戶名。奇怪的是,當我在調試過程中檢查變量時,如果我發送虛假用戶標識,但是它顯示在用戶下:null,靜態成員,並且那裏有我當前登錄的值,所以我認爲這是與潛在的使用陳述有關。 乾杯!

+0

'using'用於實現'IDisposable'的任何事物。 –

+0

更籠統地說,您應該考慮使用'using'語句(並因此使用'IDisposable')來防止*資源泄漏*。這些資源最終是「內存」,但不一定要處於更抽象的意義上(如文件句柄,數據庫連接等)。 –

+1

「使用」語句僅影響使用範圍末尾的變量,此時它將處理該變量。你確定它不是無效的用戶嗎? (因爲UserPrincipal.FindByIdentity如果未找到,則返回null) – Will

回答

3

您所描述的內容不會發生。在塊完成時,對象被丟棄時,using語句的特殊性不會發生。因此,在該塊內,user變量是相同的,無論它是否在using聲明中。

1

using語句確保即使在對象上調用方法時發生異常,也會調用Dispose。將對象放在try塊中,然後在finally塊中調用Dispose,可以獲得相同的結果;實際上,這是編譯器如何翻譯using語句。

1

C#「using」語句提供了一種方便的語法,可以確保正確使用IDisposable對象。檢查PrincipalContext是否具有一次性方法或實現IDisposable。如果沒有,那麼你不應該使用「使用」。有關更多詳情,請參閱MSDN documentation

2

使用只是try/finally的語法糖,並自動調用Dispose實現IDisposable的對象。

+0

其實,只是嘗試/終於 - 沒有趕上。 (或者是「是或否,沒有嘗試」)? –

+0

@Joe Enos,你是對的。這只是嘗試/最後。謝謝你指出。 – Icarus