Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态、对象、变量_C#_Object_Dynamic_Var - Fatal编程技术网

C# 动态、对象、变量

C# 动态、对象、变量,c#,object,dynamic,var,C#,Object,Dynamic,Var,随着.NET 4中动态类型和DLR的出现,我现在在声明我称之为“打开”类型时有3个选项: var,本地隐式类型强调“what”而不是“how” 对象,系统对象的别名,以及 动态,禁用编译器检查,在运行时添加方法/属性 虽然有很多关于这些的文章,但我没有发现任何东西能把它们放在一起,我必须承认,这仍然有点模糊 添加LINQ、lambda表达式、匿名类型、反射。。。它变得更加不稳定 我希望看到一些例子,也许是对比优势/劣势,以帮助我巩固对这些概念的理解,并帮助我理解何时、何地以及如何在它们之间进

随着.NET 4中
动态
类型和DLR的出现,我现在在声明我称之为“打开”类型时有3个选项:

  • var
    ,本地隐式类型强调“what”而不是“how”
  • 对象
    ,系统对象的别名
,以及
  • 动态
    ,禁用编译器检查,在运行时添加方法/属性
  • 虽然有很多关于这些的文章,但我没有发现任何东西能把它们放在一起,我必须承认,这仍然有点模糊

    添加LINQ、lambda表达式、匿名类型、反射。。。它变得更加不稳定

    我希望看到一些例子,也许是对比优势/劣势,以帮助我巩固对这些概念的理解,并帮助我理解何时、何地以及如何在它们之间进行选择


    谢谢大家!

    var
    :我使用它来保持代码简短:

    而不是写:

    MyFramework.MyClass.MyType myvar = new MyFramework.MyClass.MyType();
    
    我可以保持“简短”:

    与编写完整类型完全相同,因此在变量应为单一类型时使用该选项。它经常与一起使用,因为您经常与LINQ一起使用

    是所有类的根,因此当一个变量将有许多不同的、不相关的/非继承的实例时,或者当您不知道ad编译时的类型(例如反射)时,应该使用它。如果可能的话,通常应该避免使用它

    适用于本质上是动态的对象,因为它们可以有不同的方法和属性,这些方法和属性对于与COM、动态语言和领域特定语言交互非常有用。

    • 使用
      var
      使代码简短易读,或者在使用匿名类型时:

      var dict = new Dictionary<int, List<string>>();
      
      var x = db.Person.Select(p => new { p.Name, p.Age });
      

    看看这个,它提供了动态关键字的优点和局限性。

    var
    是静态类型,因此
    类型在编译和运行时是已知的(因此有助于捕获键入错误)

    dynamic
    非常类似于对象,但不限于
    Object
    方法,这里的
    类型是在运行时推断的,它将用于希望实现某些动态行为的情况


    对于
    object
    它没有任何你会使用的这样的成员,在这种情况下,泛型更受欢迎

    这不是一个匿名类型的例子(除非
    Name
    本身就是一个匿名类型,我不认为它可以)。@George,是的,修复了。我不知道我为什么那样写。
    var dict = new Dictionary<int, List<string>>();
    
    var x = db.Person.Select(p => new { p.Name, p.Age });
    
    object m_lock = new object();
    
    lock (m_lock)
    {
        // do something
    }