【问题标题】:A simple and succinct definiton and explanation of anonymous types in C#?C#中匿名类型的简单明了的定义和解释?
【发布时间】:2009-10-28 15:06:23
【问题描述】:

我不知道 C# 中的“匿名类型”是什么,也不知道它是如何使用的。谁能给我一个很好的描述它和它的用途?

[注意:我真的知道它是什么以及如何使用它,但我想我会问那些不知道的人]

【问题讨论】:

  • 这算作rep trolling吗?
  • 那些不能谷歌的人,当他们放弃时,他们可以创建一个问题。你为什么要问它是否对你没有好处?
  • @vanja, @Jherico:你会到处评论 SO 首次打开时的类似问题吗?
  • @jasonh:忽略 SO 现在与刚开始时不同的事实;是的,我认为当你不关心答案时,它只不过是重复提问。
  • 我确实在乎答案,我之所以这么问,是因为我试图回答别人的问题,但没有看到这样的问题。

标签: c# anonymous-types


【解决方案1】:

匿名类型是编译器根据如下表达式生成的类型:

new { Property1 = x.Value1, Property2 = y.Value2, z.Value3 }

(最后一个像Value3 = z.Value3)。

匿名类型的名称是“无法描述的”——也就是说,你不能在普通的 C# 中指定它——但就 CLR 而言,它是一个完全正常的类型。由于不能写名称,如果要创建匿名类型的变量(或使用匿名类型作为类型参数的泛型类型),则需要使用隐式类型的局部变量 使用 var 关键字:

var person = new { Name = "Bill", Address = "..." };

C# 匿名类型是不可变的(即属性是只读的) - 生成的类型有一个构造函数,它将所有属性的值作为参数。属性类型是从值推断出来的。

匿名类型以相当明显的方式覆盖 GetHashCodeEqualsToString - 每个属性类型的默认相等比较器用于散列和相等。

它们在 LINQ 中的使用方式通常与您在 SQL 中使用“SELECT Value1 As Property1, Value2 As Property2, Value3”的方式相同。

每个使用相同属性名和相同顺序的类型的匿名类型初始化表达式将引用相同的类型,所以你可以这样写:

var x = new { Name = "Fred", Age = 10 };
x = new { Name = "Bill", Age = 15 };

还值得知道 VB 匿名类型略有不同:默认情况下,它们是可变的。您可以使用“Key”关键字使每个单独的属性不可变。我个人更喜欢 C# 方式,但我可以看到可变性在某些情况下很有用。

【讨论】:

  • 您每天都会学到新东西。我不知道它们是不可变的并覆盖GetHashcodeEqualsToString。他们用什么覆盖 ToString?
  • @jasonh:大括号中的逗号分隔值,例如{ X = 2, Y = 10 }
  • 哦哦。有人黑了 Jon Skeet 的账户,偷走了他的代表、徽章和其他东西! ;)
【解决方案2】:
【解决方案3】:

匿名类型是没有名字的类型。您可以在不需要类型名称的任何地方使用它。例如:

var query = from x in set where x.Property1 = value select new {x.Property1, x.Property2};
foreach (var q in query) {
    // do something with q.Property1, q.Property2
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多