c# - 为什么集合初始化会忽略访问修饰符?

标签 c# .net access-modifiers

<分区>

this answer 产生,出现了一些似乎没有意义的代码:

class Program
{
    static void Main(string[] args)
    {
        var t = new Testing
        {
            ListOfStrings =
            { 
                "hello", 
                "goodbye" 
            }
        };

        Console.ReadKey();
    }
}

public class Testing
{
    public List<string> ListOfStrings { get; private set; }

    public Testing()
    {
        ListOfStrings = new List<string>();
    }
}

乍一看,人们会认为这段代码无法编译:毕竟 ListOfStrings 应该有一个私有(private)的 setter,并且不应该以这种方式分配给它。

但是,此代码编译并运行良好,t.ListOfStrings 已分配值。

为什么这个集合初始化会忽略私有(private) setter?

最佳答案

在您的示例中,您实际上并未设置该属性。

C# 足够聪明,知道您正在使用一个 ICollection,它可以使用添加、删除、清除等进行公开修改。您所做的等同于此:

t.AddRange(new string[] { "hello", "goodbye" });

如果你真的尝试这样做是行不通的:

var t = new Testing
{
    ListOfStrings = new List<string>(),
};

编辑:

由于您可能想知道如何将集合公开为只读,您可以通过将其公开为 IEnumerable 来做到这一点:

public class Testing
{
    private List<string> _listOfStrings;
    public IEnumerable<string> MyStrings
    {
        get
        {
            foreach (var s in _myStrings)
                yield return s;
        }
    }

    public Testing()
    {
        _listOfStrings = new List<string>();
    }
}

您也可以创建一个只读集合,但我发现这更令人困惑。如果将其公开为 IEnumerable,则该类的使用者可以枚举项目,但无法添加或删除项目。

关于c# - 为什么集合初始化会忽略访问修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305074/

相关文章:

c# - 对数组中的所有值执行算术运算

javascript - 如何在 Angular 中使用 Promise 并摆脱超时

java - 理解Java的protected修饰符

c# - 如何获取通过 USB 与 C#.net (VS2010/4.0+) 连接的 Android 设备的操作系统版本和设备名称?

c# - Target Framework 从 4.0 更改为 3.5 破坏了 EF 模型。错误 111 : Referential constraint errors

C# .NET RTF 到 HTML 转换器和 HTML 到 RTF 转换器库

.net - Azure 上的 Sentry 发布跟踪

C# 私有(private)、静态和只读

c# - 访问另一个类的 protected 成员

c# - 如何使用新 API 以编程方式在 Umbraco 中创建新的 MemberType