21 May 2008

Конструкція using без змінної

Дуже часто бачу код на кшталт:


using (WindowsIdentity identity = WindowsIdentity.GetCurrent().Impersonate())
{
    // Real code goes here!
}

Реально якщо посилання на об'єкт не потрібене, то і змінну декларувати не потрібно, наприклад, так теж буде працювати:


using (WindowsIdentity.GetCurrent().Impersonate())
{
    // Real code goes here!
}

Чомусь про це забувають...

Помічено як: , ,
 

Коментарі

# usarskyy said:

в таких випадках краще взагалі без "using" :) все-одно ж нема обєкта для якого треба викликати "Dispose"

21 May 08 at 7:57 AM
# Mike Chaliy said:

Все там є, і об'єкт, і Dispose

В якості приклада можно використати цей код.

public class A : IDisposable

{

public void Dispose()

{

Console.WriteLine("Dispose");

}

}

class Program

{

static void Main(string[] args)

{

using (new A())

{

Console.WriteLine("In A");

}

}

}

Це достатньо поширена ситуація коли ми свторюємо якийсь котекст, але доступ для цього контекста нам не потрібен. Наприклад в пості наведено приклад створення контексту імперсоналізації.

21 May 08 at 11:15 AM
# usarskyy said:

чесно кажучи, я думав що .NET в таких ситуаціях буде діяти трохи "розумніше" :)

не памятаю ситуацій коли б можна було використати описаний в пості "хінт", але на майбутнє обовязково запамятаю.

22 May 08 at 4:24 AM
# Mike Chaliy said:

Приклад прямо в пості, це імперсоналізація. Ви створюєте контекст, а потім потрібно зробити Undo. Якщо скористатися using то Undo буде викликано автоматично. У той самий час в WindowsImpersonationContext нічого що може знадобитися немає.

І діяти "розумніше" було б багом, томущо констукція using для того і створена щоб сто відсотково(майже) викликати Dispose().

22 May 08 at 6:53 AM
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.

About Mike Chaliy

Вчу українську, багато працюю. Цікавлюсь моделюванням небезпек. Більшість часу витрачаю на .Net.