阅读本文大概需要 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, newMyClass()); // 方式三:
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
{
private readonly 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; }
} var tag = new Tag
{
Synonyms = { "c#", "c-sharp" } // OK
};

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

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

  1. 你可能不知道的5种 CSS 和 JS 的交互方式

    翻译人员: 铁锚 翻译日期: 2014年01月22日 原文日期: 2014年01月20日 原文链接:  5 Ways that CSS and JavaScript Interact That You ...

  2. [C#.NET 拾遗补漏]05:操作符的几个骚操作

    阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...

  3. [C#.NET 拾遗补漏]06:单例模式实佳实践

    大家好,这是[C#.NET 拾遗补漏]专辑的第 06 篇文章.今天讲讲大家熟悉的单例模式. 单例模式大概是所有设计模式中最简单的一种,如果在面试时被问及熟悉哪些设计模式,你可能第一个答的就是单例模式. ...

  4. [C#.NET 拾遗补漏]07:迭代器和列举器

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 07 篇文章. 在 C# 中,大多数方法都是通过 return 语句立即把程序的控制权交回给调用者,同时也会把方法内的本地资源释放掉.而包含 yie ...

  5. [C#.NET 拾遗补漏]08:强大的LINQ

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrate ...

  6. 不知道的陷阱:C#委托和事件的困惑

    转载网址:http://www.cnblogs.com/buptzym/archive/2013/03/15/2962300.html 不知道的陷阱:C#委托和事件的困惑   一. 问题引入 通常,一 ...

  7. Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理

    Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...

  8. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  9. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

随机推荐

  1. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解

    关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...

  2. Java Concurrent包初探

    同步容器: Vector/Hashtable:jdk1.0就已经存在,jdk1.2改写实现List/Map接口.作为ArrayList/HashMap在并发场景中的替代类出现.注意:Hashtable ...

  3. 安装OPENCTI

    应业务需求,需要安装OPENCTI.很无奈的配了一下午. 首先是安装需求: 1. Ubuntu 2. Docker version 19.03.5 + docker-compose version 1 ...

  4. Word与Excel中,如何输入✔标志

    为了表达值的对错,或者相关任务是否完成,我们需要在word及excel中输入[√]和[x] Word与Excel中如何在方框“口”中打勾[√]和[x],在Word中打钩的方法有3种:第一种,在插入特殊 ...

  5. Hyperledger Fabric——balance transfer(一)启动示例

    Blacne transfer是Hyperledger fabric Node SDK的一个示例应用,主要使用了SDK中fabric-client 和 fabric-ca-client 模块中的API ...

  6. 代码行数统计的Java和Python实现

    通过编写程序来统计文件的行数,可以在巩固文件IO知识的同时计算出自己的代码量,以下分别提供Java和Python实现的版本. 解决思路 两种版本的思路几乎相同,每一个文件夹(目录)内的行数都是其所有子 ...

  7. 一、环境的安装Dev-C++

    1.https://sourceforge.net/projects/orwelldevcpp/?source=directory 2. 3. 4. 5.看到下面页面表示安装已完成啦

  8. 解决linux下启动tomcat找不到jdk

    在tomcat目录下 vim catalina.sh 头部加入 JAVA_HOME='/root/use/local/java/jdk/';export JAVA_HOME;

  9. Golang源码学习:监控线程

    监控线程是在runtime.main执行的时候在系统栈中创建的,监控线程与普通的工作线程区别在于,监控线程不需要绑定p来运行. 监控线程的创建与启动 简单的调用图 先给出个简单的调用图,好心里有数,逐 ...

  10. 5.List链表类型介绍和操作

    数据类型List链表 (1)介绍 list类型其实就是一个双向链表.通过push,pop操作从链表的头部或者尾部添加删除元素.这使得list既可以用作栈,也可以用作队列. 该list链表类型应用场景: ...