// i is compiled as an int
var i = 5;
// s is compiled as a string
var s = "Hello";
// a is compiled as int[]
var a = new[] { 0, 1, 2 };
// expr is compiled as IEnumerable
var expr =
from c in customers
where c.City == "London"
select c;
// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };
// list is compiled as List
var list &#61; new List<int>();
当属性访问器中不需要其他逻辑时&#xff0c;自动实现的属性可使属性声明变得更加简洁。当您如下面的示例所示声明属性时&#xff0c;编译器将创建一个私有的匿名后备字段&#xff0c;该字段只能通过属性的 get 和 set 访问器进行访问。
class LightweightCustomer
{
public double TotalPurchases { get; set; }
public string Name { get; private set; } // read-only
public int CustomerID { get; private set; } // read-only
}
2.1对象初始值设定项
使用对象初始值设定项可以在创建对象时向对象的任何可访问的字段或属性分配值&#xff0c;而无需显式调用构造函数。下面的示例演示如何将对象初始值设定项用于命名类型。请注意&#xff0c;在 Test 类中使用了自动实现的属性。有关更多信息&#xff0c;请参见自动实现的属性&#xff08;C# 编程指南&#xff09;。
private class Cat
{
// Auto-implemented properties
public int Age { get; set; }
public string Name { get; set; }
}
static void MethodA()
{
// Object initializer
Cat cat &#61; new Cat { Age &#61; 10, Name &#61; "Sylvester" };
}
2.2集合初始值设定项
使用集合初始值设定项可以在初始化一个实现了 IEnumerable 的集合类时指定一个或多个元素初始值设定项。元素初始值设定项可以是简单的值&#xff0c;也可以是表达式或对象初始值设定项。通过使用集合初始值设定项&#xff0c;您将无需在源代码中指定多个对该类的 Add 方法的调用&#xff1b;编译器会添加这些调用。
下面的示例演示了两个简单的集合初始值设定项&#xff1a;
List
List
下面的集合初始值设定项使用对象初始值设定项来初始化在前面的一个示例中定义的 Cat 类的对象。
{
new Cat(){ Name&#61;"Sylvester", Age&#61;8 },
new Cat(){ Name&#61;"Whiskers", Age&#61;2},
new Cat() { Name&#61;"Sasha", Age&#61;14}
};
3匿名类型&#xff08;C# 编程指南&#xff09;
匿名类型提供了一种方便的方法&#xff0c;可用来将一组只读属性封装到单个对象中&#xff0c;而无需首先显式定义一个类型。类型名由编译器生成&#xff0c;并且不能在源代码级使用。这些属性的类型由编译器推断。匿名类型无法强制转换为除 object 以外的任何类型。 下面的示例演示一个用两个分别名为 Amount 和 Message 的属性初始化的匿名类型。
static void Main(string[] args)
{
var v &#61; new { Amount &#61; 108, Message &#61; "Hello" };
// v.Amount &#61; 100;
Console.WriteLine(v.Amount);
Console.ReadKey();
}
当用其他已定义类型对象的一些属性初始化匿名类型时&#xff0c;如果您没有在匿名类型中指定成员名称&#xff0c;编译器会为匿名类型成员指定与用于初始化这些成员的属性相同的名称。必须为使用表达式初始化的属性提供名称。
from prod in products
select new { prod.Color, prod.Price };
foreach (var v in productQuery)
{
Console.WriteLine("Color&#61;{0}, Price&#61;{1}", v.Color, v.Price);
}