利用集合初始值设定项的强大功能
介绍
让我们来想象一下以下场景:我们是 DevOps 工程师。我们的任务是创建一个小型应用程序,它将根据我们服务器的操作系统、功能和层级执行操作。我们不想让这个例子过于复杂,但我们希望我们的代码优雅而直接。当然,我们也想为我们的服务器命名。
这可以通过称为Collection Initializers的语法糖来实现,该语法糖可用于实现IEnumerable接口的所有类型,其中包括Add方法!
操作系统可以是:
- 视窗
- Linux
服务器的功能可以是:
- Web 服务器
- 应用程序服务器
- 管理服务器
我们采用三层方法:
- 开发(开发者游乐场)
- 测试(生产镜像)
- 生产(赚钱)
创建我们的课程
我们将创建一个非常简单的类,如下所示:
public class Server
{
public string Name {get; set; }
public string OperatingSystem {get; set;}
public string Tier {get; set;}
public string Function {get; set;}
}
如上所述,该类有四个可访问的属性。我们可以轻松地获取和设置这些属性,如下所示。
设置名称:
WebServer = new Server();
WebServer.Name = "GateKeeper";
将名称打印到控制台:
Console.Writeline($"The server is called: {WebServer.Name}")
此 WriteLine 语句使用f 字符串表示法,我认为这是最方便且最容易理解的。请注意双引号前的$符号。
不使用集合初始化器进行初始化
首先,我们需要一个列表来保存我们的服务器,并且该列表应包含Server类型的元素。 仅当我们导入System.Collections.Generic库时,该列表才会起作用。
List<Server> servers = new List<Server>();
现在我们可以创建我们独特的服务器实例。
让我们创建一个Web 服务器:
WebServer = new Server();
WebServer.Name = "GateKeeper";
WebServer.OperatingSystem = "Windows";
WebServer.Tier = "Production";
WebServer.Function = "WebServer";
我们也需要一个应用服务器。
AppServer = new Server();
AppServer.Name = "HardWorker";
AppServer.OperatingSystem = "Linux";
AppServer.Tier = "Testing";
AppServer.Function = "AppLicationServer";
最后,我们的管理服务器:
MgmtServer = new Server();
MgmtServer.Name = "TheBoss";
MgmtServer.OperatingSystem = "Linux";
MgmtServer.Tier = "Production";
MgmtServer.Function = "ManagementServer";
呃...我已经厌倦了打字,我们甚至没有将这些添加到列表中...让我们开始吧。
servers.Add(WebServer);
servers.Add(AppServer);
servers.Add(MgmtServer);
让我们看看这里有什么。
foreach (Server machine in servers) {
Console.WriteLine($"The server called: {machine.Name} runs on {machine.OperatingSystem } inside Tier: {machine.Tier} and function: {machine.Function}");
}
这种方法的问题
这不是一个易于维护的应用程序;服务器来来去去,它们被重新命名,甚至它们的功能也会改变。这意味着我们需要一个更灵活的解决方案来创建我们的列表。一个不需要为每个服务器定义编写五行新代码并额外编写一行代码来将其添加到列表中的解决方案。我们的脆弱流程有太多步骤可能会出错。
语法糖来拯救你
为了使用这种方法,我们需要在应用程序顶部添加以下语句:
using System.Collections.Generic;
现在,我们要创建一个列表。
List<Server> srvrs = new List<Server>
{
new Server { Name = "Cell", Function = "ApplicationServer", Tier = "Production", OperatingSystem="Linux" },
new Server { Name = "TVirus", Function = "WebServer", Tier = "Test", OperatingSystem="Windows" },
new Server { Name = "Vendetta", Function = "ManagementServer", Tier = "Test", OperatingSystem="Linux" }
};
好了,就是这样。现在,每次我们有新的服务器时,我们只需给它另一行,设置属性,就可以了。我们还可以通过简单地从 Web 资源或数据库中提取服务器及其属性的列表来进一步定制我们的应用程序。这样,我们可以迭代源并动态创建我们的列表。但这是另一个指南的主题!
整个应用程序
这是完整的源代码,以确保您不会错过任何细节。请注意我如何为服务器创建一个单独的类,然后使用Program类中的公共静态来引用它。
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
public class Server
{
public string Name { get; set; }
public string OperatingSystem { get; set; }
public string Tier { get; set; }
public string Function { get; set; }
}
class Program
{
// These references are necessary to be able to instantiate the class.
public static Server WebServer { get; set; }
public static Server AppServer { get; set; }
public static Server MgmtServer { get; set; }
static void Main(string[] args)
{
//Without the sugar
List<Server> servers = new List<Server>();
WebServer = new Server();
WebServer.Name = "GateKeeper";
WebServer.OperatingSystem = "Windows";
WebServer.Tier = "Production";
WebServer.Function = "WebServer";
AppServer = new Server();
AppServer.Name = "HardWorker";
AppServer.OperatingSystem = "Linux";
AppServer.Tier = "Testing";
AppServer.Function = "AppLicationServer";
MgmtServer = new Server();
MgmtServer.Name = "TheBoss";
MgmtServer.OperatingSystem = "Linux";
MgmtServer.Tier = "Production";
MgmtServer.Function = "ManagementServer";
servers.Add(WebServer);
servers.Add(AppServer);
servers.Add(MgmtServer);
foreach (Server machine in servers)
{
Console.WriteLine($"The server called: {machine.Name} runs on {machine.OperatingSystem } inside Tier: {machine.Tier} and function: {machine.Function}");
}
// The Syntactic sugar part.
List<Server> srvrs = new List<Server>
{
new Server { Name = "Cell", Function = "ApplicationServer", Tier = "Production", OperatingSystem="Linux" },
new Server { Name = "TVirus", Function = "WebServer", Tier = "Test", OperatingSystem="Windows" },
new Server { Name = "Vendetta", Function = "ManagementServer", Tier = "Test", OperatingSystem="Linux" }
};
foreach (Server machine in srvrs) {
Console.WriteLine($"The server called: {machine.Name} runs on {machine.OperatingSystem } inside Tier: {machine.Tier} and function: {machine.Function}");
}
Console.Read();
}
}
}
结论
尽管集合初始化器只是语法糖,但它们在创建更易于理解和更强大的代码方面发挥了重要作用,因为它通过降低修改的复杂性来保护开发人员免受错误的影响。您可以看到,如果我们使用此功能,在上面的例子中,代码大小几乎是原来的一半。这些功能偶尔会出现在编程语言中,它们是开发人员工具集中非常宝贵的工具。值得花时间随时了解语言的发展以及引入了哪些新功能。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~