2012-04-03 2 views
6

Я хочу использовать заявление using только для управления областью. Могу ли я пропустить явное указание на базовый объект, который реализует IDisposable?Могу ли я использовать инструкцию using с RHV (правое значение)?

Например, давая это declaraions:

class ITransactionScope : IDisposable {} 
class TransactionGuard : ITransactionScope {...} 

class DbContext 
{ 
    public IDisposable ITransactionScope() 
    { 
     return new TransactionGuard(); 
    } 
} 

Могу ли я сделать следующее:

void main() 
{ 
    var dbContext = new DbContext(); 

    using (dbContext.TransactionScope()) 
    { 
     // the guard is not accessed here 
    } 
} 

Является ли TransactionGuard экземпляр жив во время using заявления?

+0

Вы можете попробовать. Задайте точку останова в методе 'Dispose()' экземпляра возвращенной области видимости и посмотрите, вызвана ли она. – linuxuser27

+0

Я действительно надеюсь, что вы можете, потому что я использую ту же стратегию, и она работает :) –

+3

Если все, о чем вы заботитесь, это управление областью, не можете ли вы просто поместить фигурные скобки в код (без 'использования'), и это будет явным область внутри кода? –

ответ

10

Я хочу использовать инструкцию using исключительно для управления областью.

Вы должны использовать инструкцию using, для которой она предназначена для: своевременного удаления неуправляемого ресурса. Если это не то, что вы используете using, вы, вероятно, делаете что-то неправильно.

Могу ли я опустить явную ссылку на базовый объект, который реализует IDisposable?

Как еще один ответ указал: вы уже набрали код; вы бы просто попробовали.

Да, вы можете это сделать. Компилятор создаст для вас невидимую локальную переменную и вызовет на нее Dispose.

Я рекомендую, если у вас есть дополнительные вопросы об использовании using, которые вы читаете в разделе 8.13 спецификации C# 4.

+0

Можете ли вы, пожалуйста, взглянуть на мой ответ? Разве GC не восстановит его? – Aliostad

+0

@Aliostad: спецификация C# заявляет, что 'using (expr) s;' точно эквивалентен 'X temp = expr; попробуйте {s; } finally {if (temp! = null) ((IDisposable) temp) .Dispose();} '. Является ли ваше утверждение, что сборщик мусора очистит temp * перед * вызовом 'Dispose'? –

+0

@ Эрик Возможно, вы могли бы поговорить с командой MVC о злоупотреблении функциями C#. ;) Я не возражаю против этого; это удобный синтаксис, и он не использует отражение. –

2

Он жив, пока вы не избавитесь от него. Так да.

И этот тип вопроса намного проще для вас, просто нажимая кнопку компиляции и запуска. ВЫ УЖЕ ТИПЫ КОДА. ПОПРОБУЙ.

+1

-1. Это не обязательно правда. Вы можете попробовать, и он работает 100 раз, но не в последний раз. – Aliostad

+5

@Aliostad: Я не буду следовать за тобой. Критика кажется вполне оправданной; на вопрос можно было легко ответить, просто попробовав его или даже лучше, прочитав документацию, а затем попробовав ее. Можете ли вы дать мне пример программы, в которой оператор using работает сто раз подряд, а затем выходит из строя? –

+0

@EricLippert моя точка зрения заключалась в том, что GC может вернуть ее до конца использования 'statement'. следовательно, мой ответ, так что было бы признательно, если бы вы могли его просмотреть. – Aliostad

Смежные вопросы