【问题标题】:Implicitly Typed vs Anonymous Type隐式类型与匿名类型
【发布时间】:2013-08-02 05:58:54
【问题描述】:

隐式类型和匿名类型之间是否相同或有什么不同。如果不同,那么隐式类型和匿名类型之间的主要区别是什么?

【问题讨论】:

标签: c# .net anonymous-types implicit


【解决方案1】:

有很大的不同:

隐式类型(局部)变量,是没有明确给出类型的变量:

var i = new StringBuilder();

现在,i 隐式属于 StringBuilder 类型 - 一个命名类型。

另一边的匿名类型没有名字,它们是匿名的:

var x = new { Foo = "Bar" };

x 现在是匿名类型,具有只读属性Foo。

【讨论】:

    【解决方案2】:

    匿名类型只能在它被声明的范围内使用。所以你可以将它用于本地任务,而不能在外部范围内使用它。

    引入匿名类型以与 linq 一起使用以实现简单的分组和转换。 主要目标是避免在单一作用域中使用显式类型声明。

    List<TypeOne> firstList;
    List<TypeTwo> secondList;
    
    var joined = firstList
        .GroupJoin(secondlist, i => i.KeyOfTypeOne, i => i.KeyOfTypeTwo, (first, second) => new { First = first, Second = second});
    

    所以声明了一个新的匿名类型,你可以在相同的上下文中使用它,但不能作为强类型对象发送到当前作用域的边界

    TypeName Method() // you can't specify a type here except object or dynamic
    {
       ...
       return joined;
    }
    

    但你可以在本地使用它,没有任何限制

    return joined.Where(i => i.Second.Any()).Select(i => i.First);
    

    另一方面,隐式类型变量用于允许您使用匿名类型的对象。编译器将调查您的代码并输入真实类型而不是 var 关键字。

    var inst = new {Name = "a";}
    

    编译器会生成一个匿名类型 "{Name = "a";}" 并用它来替换代码中的 var。

    【讨论】:

    • 你确定不能通过动态类型返回匿名类型吗?
    • 你可以按对象类型返回,但我看不出有什么理由使用它。
    • 我也没有看到太多原因,但是,您在帖子中声明它会引发编译错误。
    【解决方案3】:

    它们之间有一些区别

    隐式类型

    我们可以知道分配给var的数据类型或类的类型

    e.g.
    
    var i = 10; /*here int datatype assigned*/
    var A = new ArrayList(); /*here arraylist() class assigned*/
    

    我们也可以在另一个作用域中使用隐式类型。

    匿名类型

    当我们不确定分配给 var 的类的类型时

    e.g.
    var a = new { Age = 12 , Name = X };
    

    匿名变量仅在声明它的范围内使用。但不能在另一个范围内使用,也不能写在方法的返回语句中。

    在 Linq 语句中通常使用匿名。

    【讨论】:

      【解决方案4】:

      来自Implicitly Typed Local Variables (C# Programming Guide):

      可以给局部变量一个推断的“类型” var 而不是 显式类型。 var 关键字指示编译器推断 右侧表达式中的变量类型 初始化语句。推断的类型可能是内置类型, 匿名类型、用户定义的类型或在 .NET 中定义的类型 框架类库。

      还有:

      重要的是要理解 var 关键字并不意味着 “variant”,并不表示变量是松散类型的,或者 迟到。 这只是意味着编译器确定并分配 最合适的类型。

      匿名类型和隐式类型变量之间存在关键关系:

      在许多情况下,使用 var 是可选的,只是一种语法 方便。但是,当使用匿名变量初始化变量时 如果您需要访问 对象的属性在稍后的时间点。

      【讨论】:

        【解决方案5】:

        它们之间几乎没有根本区别

        匿名类型:

        它们实际上是类类型,除了只读属性之外别无其他。没有方法没有事件。它们不能在本地范围之外访问/声明。例如,如果在方法内部定义,则无法在该方法外部访问它们。

        隐式输入

        我们可以使用var 作为隐式类型。这实际上意味着表达式右侧的任何类型都将由编译器分配给此 var。这些不能为空。

        【讨论】:

          猜你喜欢
          • 2021-01-06
          • 1970-01-01
          • 2010-09-28
          • 1970-01-01
          • 2016-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-14
          相关资源
          最近更新 更多