首页 > 解决方案 > 这种初始化IList的奇怪方式是什么在 Xamarin 代码库中?

问题描述

我正在查看 Xamarin 代码库(在本例中为StackLayout类),我在 C# 中使用了这行奇怪的代码,我无法理解其语法:

var layout = new StackLayout()
{
    Children =
    { // What is this!!!?
        new Label()
        {
            Text = "Hello",
        },
        new Entry()
        {
            Text = "Hi"
        },
    }
};

我不明白的代码是它初始化Children属性的方式。Children是一个没有 setter的get-only属性。

不仅正在初始化,而且还没有new List<>before {

Resharper 可以将其转换为使用.Add()而不是此初始化。所以它似乎不是初始化。

我认为 C# 中添加了一些我不知道的东西!

标签: c#

解决方案


这只是集合的“初始化语法”的一种变体,在初始化新实例中的属性值时有效。

初始化器语法通常允许在使用运算符时为属性分配值new。然后,在该上下文中,集合初始化器语法将分配映射到对Add()方法的一系列调用(如果存在,在这种情况下就是这样)。

这不是 Xamarin 独有的。这是一个简单的 C# 示例:

public class Class1
{
    public IList<string> List { get; } = new List<string>();

    public static Class1 M()
    {
        return new Class1
        {
            List =
            {
            "foo", "bar"
            }
        };
    }
}

推荐阅读