Динамический, Объект, Вар - PullRequest
7 голосов
/ 22 июня 2011

С появлением типа dynamic и DLR в .NET 4 у меня теперь есть 3 варианта для объявления того, что я называю «открытыми» типами:

  • var, локально неявные типы, чтобы подчеркнуть «что» вместо «как»,
  • object, псевдоним для System.Object и
  • dynamic, отключить проверки компилятора, добавить методы / свойства во время выполнения

Хотя там много написано об этом, ничего, что я нашел, соединяет их вместе, и я должен признаться, это все еще немного размыто.

Добавьте к этому LINQ, лямбда-выражения, анонимные типы, рефлексию ... и это станет более шатким.

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

Спасибо!

Ответы [ 5 ]

5 голосов
/ 22 июня 2011
  • Используйте var, чтобы сделать код коротким и более читабельным, или при работе с анонимными типами:

    var dict = new Dictionary<int, List<string>>();
    
    var x = db.Person.Select(p => new { p.Name, p.Age });
    
  • Используйте dynamic, когда динамическое связывание полезно или требуется. Или когда вам нужно решить, какой метод вызывать, основываясь на типе времени выполнения объекта.

  • Используйте object как можно меньше, предпочитайте использовать определенные типы или дженерики. Единственное место, где это полезно, это когда объект используется только для блокировки:

    object m_lock = new object();
    
    lock (m_lock)
    {
        // do something
    }
    
3 голосов
/ 22 июня 2011

var - это то же самое, что и запись полного типа, поэтому используйте это, когда переменная должна быть одного типа.Он часто используется с LINQ , поскольку вы часто используете анонимные типы с LINQ.

object является корнем всех классов, ипоэтому следует использовать, когда переменная будет иметь много разных, не связанных / не унаследованных экземпляров, или когда вы не знаете время компиляции объявления типа (например, отражение).Обычно его следует избегать, если это возможно.

dynamic предназначено для объектов динамического характера, поскольку они могут иметь различные методы и свойства, которые полезны для взаимодействия с COM.а также динамические языки и языки, специфичные для предметной области.

2 голосов
/ 22 июня 2011

var: я использую его для краткости кода:

вместо записи:

MyFramework.MyClass.MyType myvar = new MyFramework.MyClass.MyType();

я могу сделать это "коротким":

var myVar = new MyFramework.MyClass.MyType();
1 голос
/ 22 июня 2011

var является статически типизированным, поэтому Type известен во время компиляции и во время выполнения (что помогает отловить опечатки)

dynamic очень похоже на объекты, но не ограничено, как это было бы с Object методов, здесь Type выводится во время выполнения, оно будет использоваться в тех случаях, когда вы хотите добиться некоторого динамического поведения.

Хорошо для object у него нет таких членов, которые выбудет использовать, Generics будет более предпочтительным в таких случаях

0 голосов
/ 22 июня 2011

Ознакомьтесь с этой статьей , которая дает преимущества и ограничения ключевого слова Dynamic.

...