Можете ли вы объяснить анонимный тип использования оператора using? - PullRequest
0 голосов
/ 02 апреля 2011

Можете ли вы объяснить анонимный тип в использовании оператора using?Можете ли вы объяснить плюсы и минусы двух видов использования?

using(var myCtx = new Entity() )
{

}

Другой:

using(Entity myCtx = new Entity() )
{

}

В чем разница между ними?

Ответы [ 4 ]

5 голосов
/ 02 апреля 2011

Это неявно типизированная переменная , а не анонимный тип. (Анонимный тип - это то, что вы получаете, используя выражение, такое как new { X = 10, Y = "hello" }.

Ваши два фрагмента кода в точности эквивалентны - компилятор просто выводит тип myCtx: он все еще статически типизирован; объект все еще будет утилизирован и т. д.

Здесь нет ничего конкретного для оператора using - вы можете использовать неявную типизацию для любой локальной переменной, при условии, что требуемый тип совпадает с типом времени компиляции выражения инициализации. (Если значение null или анонимная функция, вам нужно привести значение, и в этот момент разумно бессмысленно использовать var, если честно.)

Откровенный плагин: более подробную информацию о неявной типизации и анонимных типов вы можете найти в главе 8 моей книги, C # in Depth. К счастью, это одна из бесплатных глав, которую вы можете скачать со страницы Manning для книги .

2 голосов
/ 02 апреля 2011

Нет разницы между IL, созданным для обоих операторов, они функционально идентичны.Здесь вы позволяете компилятору выводить тип myCtx, , а не , создавая анонимный тип.Это может сделать код значительно более понятным, например:

var items = new Dictionary<int, Dictionary<int, string>>();

является более понятным и не скрывает намерений кода, чем:

Dictionary<int, Dictionary<int, string>> items = 
    new Dictionary<int, Dictionary<int, string>>();
2 голосов
/ 02 апреля 2011

Это не анонимный тип, а просто ярлык синтаксиса. Что касается компилятора, два оператора одинаковы.

2 голосов
/ 02 апреля 2011

Это на самом деле не использование анонимного типа ... это предполагаемое использование типа.Использование ключевого слова var просто «выводит» тип в левой части назначения на основе правой части назначения.

Плюсы:

  • Устраняет избыточность (например,MyType a = new MyType () крайне избыточен и не нужен)

Минусы:

  • Запутывает код при использовании в определенных сценариях (например, var a =GetSomething (); --- какой тип? Я не знаю, не глядя на возвращаемый тип GetSomething ())

  • Вы теряете способность к полиморфизму при использовании var (у вас не может быть MyParentType a = new MySubType ()) - это на самом деле не мошенничество, а скорее неверный вариант использования ключевого слова var.

Мое эмпирическое правилов том, что мне нравится ключевое слово var, но я использую его только в тех случаях, когда его намерения уже явные ... то есть я использую его при использовании нового ключевого слова, но не для циклов foreach или присваиваний, основанных на возвращаемом значении метода.

...