Путать с C # «использование» - PullRequest
5 голосов
/ 05 августа 2011

Я видел некоторый код для работы с AD в этом вопросе stackoverflow

Я запутался насчет оператора using.Я подумал, что он просто используется для вещей, которые вас беспокоят, могут стать утечкой памяти, например, веб-клиентом или подобным ...

В любом случае:

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

когда я доберусь до линии var groups = user.GetAuthorizationGroups() - пользователь имеет значение null, поэтому в строке произойдет сбой NullReference.Когда я нащупываю указатель мыши, отображается нулевое значение, затем отображаются статические члены и все значения.

Если я вычеркну строку из оператора using и просто укажу var user = UserPrincipal.FindByIdentity( context, "username" ), пользователь будет заполнен как требуется.

Так что же происходит ???

Редактировать: Я набили отправлял поддельное имя пользователя.Как ни странно, когда я проверяю переменные во время отладки, когда вы ожидаете, что user будет полностью нулевым, если я отправлю поддельный идентификатор пользователя, но он отобразится в user: null, статические члены, и там были значения для того, что я в настоящий момент вошел в систему какпоэтому я подумал, что это потенциально связано с оператором using.Ура!

Ответы [ 4 ]

3 голосов
/ 05 августа 2011

То, что вы описываете, не может произойти. Особенность оператора using не происходит, пока блок не будет завершен, когда объект будет удален. Таким образом, внутри этого блока переменная user одинакова независимо от того, находится она в операторе using или нет.

2 голосов
/ 05 августа 2011

using - это просто синтаксический сахар для try / finally и автоматически вызывает Dispose для объектов, которые реализуют IDisposable.

1 голос
/ 05 августа 2011

Оператор C # «using» предоставляет удобный синтаксис, который обеспечивает правильное использование IDisposable объектов. Проверьте, имеет ли PrincipalContext доступный метод или реализует IDisposable. Если нет, то вам не следует использовать «использование». См. Документация MSDN для получения более подробной информации.

1 голос
/ 05 августа 2011

Оператор using гарантирует, что Dispose вызывается, даже если возникает исключение во время вызова методов для объекта. Вы можете достичь того же результата, поместив объект в блок try, а затем вызвав Dispose в блоке finally; на самом деле, именно так оператор using переводится компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...