张赐荣——一位视障程序员。
赐荣小站: www.prc.cx

張賜榮

张赐荣的技术博客

博客园 首页 新随笔 联系 订阅 管理

C# 对象与集合初始化器

概述

对象初始化器可用于以声明性地方式初始化类型对象,不需要显式调用该类型的构造函数。

设定对象初始值

以下示例演示如何将对象初始化器用于命名对象。
编译器通过首先访问无参数实例构造函数,然后处理成员初始化来处理对象初始值设定项。
因此,如果无参数构造函数在类中声明为私有,则需要公共访问的对象初始值设定项将失败。
如果要定义匿名类型,必须使用对象初始值设定项。
以下历程展示如何使用对象初始值设定项初始化新的studentname类型。
此示例设置studentname类型中的属性"FirstName"和"LastName":

public class HowToObjectInitializers
{
public static void Main()
{
// 使用具有两个参数的构造函数声明StudentName。
StudentName student1 = new StudentName("Craig", "Playstead");
// 使用对象初始值设定项并传递
// 名字和姓氏的参数。无参数构造函数是
//在处理此声明时调用,而不是已 两个参数。
StudentName student2 = new StudentName
{
FirstName = "Craig",
LastName = "Playstead"
};
//通过使用对象初始值设定项并传递,仅用于ID属性的参数。没有相应的构造函数。只有无参数构造函数用于处理对象初始值设定项。
StudentName student3 = new StudentName
{
ID = 183
};
//通过使用对象初始值设定项并发送
//所有三个属性的参数。没有相应的构造函数
//在类中定义。
StudentName student4 = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
ID = 116
};
Console.WriteLine(student1.ToString());
Console.WriteLine(student2.ToString());
Console.WriteLine(student3.ToString());
Console.WriteLine(student4.ToString());
}
// 输出:
// Craig 0
// Craig 0
// 183
// Craig 116
public class StudentName
{
// 此构造函数没有参数。无参数构造函数
// 在处理对象初始值设定项时调用。
// 您可以通过将访问修饰符从public更改为
// 私人。主要使用对象初始值设定项的声明将
// 失败。
public StudentName() { }
//以下构造函数具有三个参数中的两个参数
//属性。

public StudentName(string first, string last)
{
FirstName = first;
LastName = last;
}
// 属性。
public string FirstName { get; set; }
public string LastName { get; set; }
public int ID { get; set; }
public override string ToString() => FirstName + " " + ID;
}
}

集合初始值设定项

对象初始值设定项也可用于在对象中设置索引器。
下面的示例定义了一个 BaseballTeam 类,该类使用索引器获取和设置不同位置的球员。
初始值设定项可以根据位置的缩写或每个位置的棒球记分卡的编号来分配球员:

public class HowToIndexInitializer
{
public class BaseballTeam
{
private string[] players = new string[9];
private readonly List<string> positionAbbreviations = new List<string>
{
"P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF"
};
public string this[int position]
{
// 棒球的位置是1-9。
get { return players[position-1]; }
set { players[position-1] = value; }
}
public string this[string position]
{
get { return players[positionAbbreviations.IndexOf(position)]; }
set { players[positionAbbreviations.IndexOf(position)] = value; }
}
}
public static void Main()
{
var team = new BaseballTeam
{
["RF"] = "Mookie Betts",
[4] = "Jose Altuve",
["CF"] = "Mike Trout"
};
Console.WriteLine(team["2B"]);
}
}

参考: 《对象和集合初始值设定项》:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/how-to-initialize-objects-by-using-an-object-initializer

[编辑: 张赐荣]

posted on 2022-07-16 08:33  张赐荣  阅读(188)  评论(0编辑  收藏  举报

感谢访问张赐荣的技术分享博客!
博客地址:https://cnblogs.com/netlog/
知乎主页:https://www.zhihu.com/people/tzujung-chang
个人网站:https://prc.cx/