C# 中的表达式体函数语法
介绍
在 C# 6 版中,编程语言中添加了一项期待已久的功能,称为表达式体成员。此功能背后的想法是使代码更具可读性和简洁性。
在本指南中,我们将了解如何将此新功能整合到我们的代码中,阐明成员是什么,并查看在不同成员类型上使用该概念的示例。使用数据中心中服务器抽象的示例,我们将学习如何使用这个新概念为我们的服务器创建一个易于维护的类。
成员
成员的概念与面向对象编程及其类相关。成员允许您修改类的行为、更改其与其他类的交互方式,并让其根据需要封装信息。成员是将应用程序结合在一起并使您的代码充满活力的粘合剂。
有以下成员可供选择:
- 构造函数
- 析构函数
- 属性 getter 和 setter
- 方法
- 索引器
表达式体成员可应用于上述任何一个,但请考虑您当前版本的 C# 中哪一个可用。
版本 6 中支持的成员包括:
- 属性 getter
- 方法
在版本 7 中支持:
- 构造函数
- 析构函数
- 属性设置器
- 索引器
定义类的表达式体成员的代码骨架如下所示:
member => expression;
构造函数和析构函数
这一小节将演示如何使用表达式体为类创建构造函数和析构函数。构造函数在您创建类的新实例时被调用,它们用于初始化成员。析构函数有时也称为终结器,它们的目标恰恰相反。在对象实例因垃圾收集器的清理而消亡之前,它允许您实现额外的业务逻辑或执行特定操作。
定义一个名为Server的类,该类具有一个构造函数,该构造函数接受一个字符串参数,该参数将是服务器的名称。终结器应发出消息“即将结束...”
使用表达式体构造函数,它应该看起来像这样:
using System;
namespace Pluralsight
{
public class Server
{
public string Name;
public Server(string name) => Name = name;
~Server() => Console.WriteLine("The end is near...");
}
public class ConstructorBody
{
public static void Main()
{
Server a = new Server("Domain Controller");
Console.WriteLine($"The name of the server is: {a.Name}");
Console.ReadKey();
}
}
}
代码的执行产生以下输出:
The name of the server is: Domain Controller
The end is near...
在表达式体构造函数和终结器出现之前,我们的代码看起来应该是这样的:
public class Server
{
public string Name;
public Server(string name) {
Name = name;
}
~Server()
{
Console.WriteLine("The end is near...");
}
}
虽然学习使用新功能总是需要时间和实践,但哪种代码更容易阅读应该是显而易见的。
访问器
您也可以将访问器称为属性获取器和设置器。此语言元素允许您检索或修改类的属性。它们很重要,因为它们取代了旧方法,即定义GetProperty()和SetProperty()函数。
转换类并添加两个属性,vCPU和RAM。
using System;
namespace Pluralsight
{
public class Server
{
public string Name;
private int _vCPU;
private int _RAM;
public int vCPU { get => _vCPU; set => _vCPU = value; }
public int RAM { get => _RAM; set => _RAM = value; }
public Server(string name) {
Name = name;
}
~Server()
{
Console.WriteLine("The end is near...");
}
}
public class AccessorBody
{
public static void Main()
{
Server a = new Server("Domain Controller");
a.vCPU = 2;
a.RAM = 8;
Console.WriteLine($"The name of the server is: {a.Name}");
Console.WriteLine($"THe server has vCPU: {a.vCPU} and {a.RAM} GB of RAM!");
}
}
}
代码执行后你应该看到以下输出:
The name of the server is: Domain Controller
THe server has vCPU: 2 and 8 GB of RAM!
The end is near...
您应该注意到的一个区别是_vCPU和RAM被定义为类的私有属性,并且不能直接访问。通过getter和setter访问器提供对它们的访问。这种新的表示法使代码更容易理解,并跟踪属性发生了什么。当我们提到实际成员时,它们被称为vCPU和RAM。
索引器
假设您想要存储有关服务器中存在哪些网络适配器的信息。索引器是完美的解决方案。只需定义一个包含五个元素的字符串数组来存储网络适配器,而网络适配器又需要一个带有表达式主体的索引器来提供指定的值。代码应该如下所示:
using System;
namespace Pluralsight
{
public class Server
{
public string Name;
private int _vCPU;
private int _RAM;
public int vCPU { get => _vCPU; set => _vCPU = value; }
public int RAM { get => _RAM; set => _RAM = value; }
public string[] NetworkAdapters = new string[5];
public string this[int i] { get => NetworkAdapters[i]; set => NetworkAdapters[i] = value; }
public Server(string name) {
Name = name;
}
~Server()
{
Console.WriteLine("The end is near...");
}
}
public class ConstructorBody
{
public static void Main()
{
Server a = new Server("Domain Controller");
a.vCPU = 2;
a.RAM = 8;
a.NetworkAdapters[0] = "LAN A";
a.NetworkAdapters[1] = "LAN B";
a.NetworkAdapters[2] = "LAN C";
Console.WriteLine($"The name of the server is: {a.Name}");
Console.WriteLine($"THe server has vCPU: {a.vCPU} and {a.RAM} GB of RAM!");
Console.WriteLine($"The following network adapters are available:");
foreach (string adapter in a.NetworkAdapters) {
if (!string.IsNullOrEmpty(adapter))
{ Console.WriteLine($"\tNetwork Adapter: {adapter}"); }
};
}
}
}
执行后可见以下输出:
The name of the server is: Domain Controller
THe server has vCPU: 2 and 8 GB of RAM!
The following network adapters are available:
Network Adapter: LAN A
Network Adapter: LAN B
Network Adapter: LAN C
The end is near...
您的课程中索引器的核心是以下两行:
public string[] NetworkAdapters = new string[5];
public string this[int i] { get => NetworkAdapters[i]; set => NetworkAdapters[i] = value; }
第一个只是一个字符串数组,第二个是带有表达式主体的索引器本身。
分配网络适配器时,您只需获取一个值并将其传递给适配器的相应索引,即a.NetworkAdapters[]。如果您检索值,foreach 循环就是您的救星。它会遍历数组,如果数组不为空或为 null,则适配器的名称将变为可见。您还可以存储更多信息或使用更合适的数据结构来捕获 IP 地址或 MAC 地址。
方法
最后,您可能希望向服务器类添加一些额外的功能并定义一些表达式体方法,或者有时称为函数。
引入三个函数,Start(),Stop()和Restart() ,以及一个名为State 的新属性及其 getter 和 setter。
最终代码应类似于此:
using System;
namespace Pluralsight
{
public class Server
{
public string Name;
private int _vCPU;
private int _RAM;
private string _State;
public int vCPU { get => _vCPU; set => _vCPU = value; }
public int RAM { get => _RAM; set => _RAM = value; }
public string State { get => _State; set => _State = value; }
public string[] NetworkAdapters = new string[5];
public string this[int i] { get => NetworkAdapters[i]; set => NetworkAdapters[i] = value; }
public void Start() { Console.WriteLine($"Starting Server {Name}"); _State = "Started"; }
public void Stop() { Console.WriteLine($"Stopping Server {Name}"); _State = "Stopped"; }
public void Restart() { Console.WriteLine($"Restarting Server {Name}"); Stop(); Start(); }
public Server(string name) {
Name = name;
}
~Server()
{
Console.WriteLine("The end is near...");
}
}
public class ConstructorBody
{
public static void Main()
{
Server a = new Server("Domain Contro
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~