本人博客已迁移至:https://z2h.cn

精致码农 • 王亮

Be humble, communicate clearly, and respect others.

本人博客已迁移至: z2h.cn
(博客园的文章图片均已失效)

[C#.NET 拾遗补漏]03:你可能不知道的几种对象初始化方式

阅读本文大概需要 1.2 分钟。

随着 C# 的升级,C# 在语法上对对象的初始化做了不少简化,来看看有没有你不知道的。

数组的初始化

在上一篇罗列数组的小知识的时候,其中也提到了数组的初始化,这时直接引用过来。

int[] arr = new int[3] {1, 2, 3}; // 正儿八经的初始化
int[] arr = new [] {1, 2, 3};     // 简化掉了 int 和数组容量声明
int[] arr = {1, 2, 3};            // 终极简化

字典的两种初始化方式

第二种是 C# 6 的语法,可能很多人不知道。

// 方式一:
var dict = new Dictionary<string, int>
{
    { "key1", 1 },
    { "key2", 20 }
};

// 方式二:
var dict = new Dictionary<string, int>
{
    ["key1"] = 1,
    ["key2"] = 20
};

含自定义索引器的对象初始化

这种初始化原理上其实是和上面字典的第二种初始化是一样的。

public class IndexableClass
{
    public int this[int index]
    {
        set
        {
            Console.WriteLine("{0} was assigned to index {1}", value, index);
        }
    }
}

var foo = new IndexableClass
{
    [0] = 10,
    [1] = 20
}

元组(Tuple)的三种初始化方式

前面两种方式很常见,后面一种是 C# 7 的语法,可能有些人不知道。

// 方式一:
var tuple = new Tuple<string, int, MyClass>("foo", 123, new MyClass());

// 方式二:
var tuple = Tuple.Create("foo", 123, new MyClass());

// 方式三:
var tuple = ("foo", 123, new MyClass());

另外补充个小知识,在 C# 7 中,元组的元素可以被解构命名:

(int number, bool flage) tuple = (123, true);
Console.WriteLine(tuple.number); // 123
Console.WriteLine(tuple.flag);   // True

自定义集合类的初始化

只要自定义集合类包含Add方法,便可以使用下面这种初始化方式为集合初始化元素。

class Program
{
    static void Main()
    {
        var collection = new MyCollection {
            "foo",         // 对应方法:Add(string item)
            { "bar", 3 },  // 对应方法:Add(string item, int count)
            "baz",         // 对应方法:Add(string item)
            123.45d,       // 对应扩展方法:Add(this MyCollection @this, double value)
        };
    }
}

class MyCollection : IEnumerable
{
    privatereadonly IList _list = new ArrayList();

    public void Add(string item)
    {
        _list.Add(item);
    }

    public void Add(string item, int count)
    {
        for (int i = 0; i < count; i++)
        {
            _list.Add(item);
        }
    }

    public IEnumerator GetEnumerator()
    {
        return _list.GetEnumerator();
    }
}

static class MyCollectionExtensions
{
    public static void Add(this MyCollection @this, double value) =>
        @this.Add(value.ToString());
}

对象的集合属性初始化

我们知道对集合的初始化必须使用new创建该集合,不能省略,比如:

// OK
IList<string> synonyms = new List<string> { "c#", "c-sharp" };

// 编译报错,不能省略 new List<string>
IList<string> synonyms = { "c#", "c-sharp" };

但如果该集合作为另外一个类的属性,则可以省略new,比如:

public class Tag
{
    public IList<string> Synonyms { get; set; } = new List<string>();
}

var tag = new Tag
{
    Synonyms = { "c#", "c-sharp" } // OK
};

能想到和找到的就这么点了,希望以上会对你的编程有所帮助。

posted @   精致码农  阅读(2567)  评论(11编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示