对象和集合初始值设定项

使用对象初始值设定项可以在创建对象时向对象的任何可访问的字段或属性分配值,而无需显式调用构造函数。 下面的示例演示如何将对象初始值设定项用于命名类型 (Cat)。 请注意,在 Cat 类中使用了自动实现的属性。 有关更多信息,请参见 自动实现的属性(C# 编程指南)

C#
privateclass Cat
{
    // Auto-implemented properties.publicint Age { get; set; }
    publicstring Name { get; set; }
}


C#
Cat cat = new Cat { Age = 10, Name = "Fluffy" };


尽管对象初始值设定项可以用在任何上下文中,但它们在 LINQ 查询表达式中尤其有用。 查询表达式常使用只能通过使用对象初始值设定项进行初始化的匿名类型,如下面的声明所示。

var pet = new { Age = 10, Name = "Fluffy" };

利用匿名类型,LINQ 查询表达式中的 select 子句可以将原始序列的对象转换为可能具有不同的值和形式的对象。 如果您只想存储某个序列中每个对象的部分信息,这会有用。 在下面的示例中,假定某个产品对象 (p) 包含很多字段和方法,而您只想创建包含产品名称和单价的对象序列。

C#
var productInfos =
    from p in products
    select new { p.ProductName, p.UnitPrice };


当执行此查询时,productInfos 变量将包含一个对象序列,而这些对象可以在 foreach 语句中访问,如下面的示例所示:

foreach(var p in productInfos){...}

新的匿名类型中的每个对象都具有两个公共属性,这两个属性具有与原始对象中的属性或字段相同的名称。 还可以在创建匿名类型时重命名字段;下面的示例将 UnitPrice 字段重命名为 Price

select new {p.ProductName, Price = p.UnitPrice};

将集合初始值设定项用于可为 null 的结构会导致编译时错误。

使用集合初始值设定项可以在初始化一个实现了 IEnumerable 的集合类时指定一个或多个元素初始值设定项。 元素初始值设定项可以是简单的值,也可以是表达式或对象初始值设定项。 通过使用集合初始值设定项,您将无需在源代码中指定多个对该类的 Add 方法的调用;编译器会添加这些调用。

下面的示例演示了两个简单的集合初始值设定项:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };

下面的集合初始值设定项使用对象初始值设定项来初始化在前面的一个示例中定义的 Cat 类的对象。 请注意,各个对象初始值设定项被分别括在大括号中,并且用逗号分隔。

C#
List<Cat> cats = new List<Cat>
{
    new Cat(){ Name = "Sylvester", Age=8 },
    new Cat(){ Name = "Whiskers", Age=2 },
    new Cat(){ Name = "Sasha", Age=14 }
};


如果集合的 Add 方法允许,可以将 null 指定为集合初始值设定项中的一个元素。

C#
List<Cat> moreCats = new List<Cat>
{
    new Cat(){ Name = "Furrytail", Age=5 },
    new Cat(){ Name = "Peaches", Age=4 },
    null
};


C#
// The following code consolidates examples from the topic.
class ObjInitializers
{
    private class Cat
    {
        // Auto-implemented properties.
        public int Age { get; set; }
        public string Name { get; set; }
    }

    static void Main()
    {
        Cat cat = new Cat { Age = 10, Name = "Fluffy" };

        List<Cat> cats = new List<Cat>
        {
            new Cat(){ Name = "Sylvester", Age=8 },
            new Cat(){ Name = "Whiskers", Age=2 },
            new Cat(){ Name = "Sasha", Age=14 }
        };

        List<Cat> moreCats = new List<Cat>
        {
            new Cat(){ Name = "Furrytail", Age=5 },
            new Cat(){ Name = "Peaches", Age=4 },
            null
        };

        // Display results.
        System.Console.WriteLine(cat.Name);

        foreach (Cat c in cats)
            System.Console.WriteLine(c.Name);

        foreach (Cat c in moreCats)
            if (c != null)
                System.Console.WriteLine(c.Name);
            else
                System.Console.WriteLine("List element has null value.");
    }
    // Output:
    //Fluffy
    //Sylvester
    //Whiskers
    //Sasha
    //Furrytail
    //Peaches
    //List element has null value.
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值