使用静态简化 C# 中对静态成员的引用
介绍
在本指南中,我们将讨论如何引用 C# 类型以及如何使用using指令和较新的using static指令简化引用它们的方式。我们首先回顾一下如何在不使用 using指令的情况下引用类型,以及using namespace 指令如何简化 C# 代码并提高其可读性。我们将继续讨论using static指令,我们将通过几个示例来了解它是什么以及它如何进一步简化 C# 代码。最后,我们将考虑using static指令如何影响我们编写的 C# 代码的可读性。
使用命名空间限定对 C# 类型的引用
以下示例使用Console.WriteLine将两行内容写入控制台。解析对Console类的引用时,C# 编译器需要知道它位于哪个命名空间中。我们通过使用此命名空间限定对它的引用来告诉编译器我们要使用的Console类位于System命名空间中:
System.Console.WriteLine("C# is awesome.");
System.Console.WriteLine("Pluralsight Guides make C# even more awesome.");
现在编译器确切地知道了在哪里可以找到Console类,但是我们必须告诉它两次。如果我们添加更多对Console.WriteLine的调用,我们将不得不一次又一次地告诉编译器我们要使用的Console类位于System命名空间中。
using 指令
我们不需要在引用Console类的所有地方都指定System.Console,而是可以为System命名空间引入一个using指令:
using System;
using指令使命名空间中的类型可用,而无需使用命名空间限定引用。 对于使用Console类的示例,这意味着我们不再需要使用其System命名空间限定对该类的引用:
Console.WriteLine("C# is awesome.");
Console.WriteLine("Pluralsight Guides make C# even more awesome.");
即使只是这个小小的改变,我们也已经简化了代码,使其更具可读性。我们也不再重复自己了。好吧,我们已经停止重复System.,但我们也可以停止重复Console.吗?
using static 指令
C# 6 在 2015 年发布时引入了using static指令。该指令允许我们引用静态成员,而无需引用命名空间甚至类型本身。
using static指令也可用于引用嵌套类型。
我们在示例中使用的WriteLine方法是Console类的静态成员。让我们看一个例子,了解using static指令如何进一步简化对Console.WriteLine的引用:
using static System.Console;
有了这个指令,我们可以引用Console类的静态成员,甚至不需要引用该类本身:
WriteLine("C# is awesome.");
WriteLine("Pluralsight Guides make C# even more awesome.");
这样代码就更简单了,重复代码比上一个示例更少。我们从使用Console.WriteLine变为仅使用WriteLine,但这比上一个示例更易读吗?在讨论可读性之前,让我们先看一个更完整的示例。
示例:超棒的 Base64 编码器
假设我们被要求编写一个小型 C# 程序,该程序提示用户输入一个字符串,并将其以Base64字符串编码的形式写回控制台。如果不使用静态指令,我们得出以下解决方案:
using System;
using System.Text;
class Program
{
static void Main()
{
Console.WriteLine("--- Super Awesome Base64 Encoder ---");
Console.Write("Enter a string to encode: ");
var userInput = Console.ReadLine();
Console.WriteLine(Base64Encode(userInput));
}
static string Base64Encode(string str)
{
var strBytes = Encoding.UTF8.GetBytes(str);
var strBase64 = Convert.ToBase64String(strBytes);
return strBase64;
}
}
我们运行我们的程序,输入一串“I love Pluralsight Guides”,然后高兴地看到使用我们最喜欢的Console类向我们显示字符串的 Base64 编码版本:
--- Super Awesome Base64 Encoder ---
Enter a string to encode: I love Pluralsight Guides
SSBsb3ZlIFBsdXJhbHNpZ2h0IEd1aWRlcw==
现在我们知道了这个使用静态指令的事情,我们为System.Console引入它并从代码中删除Console的所有痕迹:
using System;
using System.Text;
using static System.Console;
class Program
{
static void Main()
{
WriteLine("--- Super Awesome Base64 Encoder ---");
Write("Enter a string to encode: ");
var userInput = ReadLine();
WriteLine(Base64Encode(userInput));
}
static string Base64Encode(string str)
{
var strBytes = Encoding.UTF8.GetBytes(str);
var strBase64 = Convert.ToBase64String(strBytes);
return strBase64;
}
}
通过这一更改,我们简化了对Console.WriteLine、Console.Write和Console.ReadLine的引用。相反,我们只分别引用WriteLine、Write和ReadLine 。我们可以对Encoding.UTF8和Convert做同样的事情,但这又回到了可读性的问题。我们是否让代码更具可读性?我们是否最终让代码的可读性降低了?
可读性
当我们从System.Console.WriteLine转到Console.WriteLine时,代码变得更易读了。当我们看到Console.WriteLine时,我们可能已经知道Console位于System命名空间中。即使我们不知道这一点,仍然很清楚Console.WriteLine会将一行写入控制台。
当我们从Console.WriteLine转到WriteLine时,代码是否变得更易读了?WriteLine向控制台写入一行是否足够清晰?这是一个主观问题。这里没有正确或错误的答案。在使用静态指令编写代码时,我们需要考虑代码运行的上下文。在控制台应用程序中Main方法的上下文中, WriteLine将写入控制台可能相当清楚。但也可能不是。
对于某些类型,使用静态指令比其他类型更具可读性。以下是一些可供参考的示例:
- Environment.GetEnvironmentVariable("PATH")可以变成GetEnvironmentVariable("PATH")。
- String.Concat("Pluralsight", " ", "Guides")可以变成Concat("Pluralsight", " ", "Guides")。
- File.OpenRead("/path/to/file")可以变成OpenRead("/path/to/file")。
正如我们已经说过的,这里没有正确或错误的答案。考虑上述示例,并自行决定它们是否会使您的代码更易读或更难读。如果您在团队中工作,请与您的队友讨论一些示例,并尝试提出可读性对您的团队意味着什么的想法。
结论
using static指令简化了对静态成员和嵌套类型的引用,让我们可以编写更少的代码。请谨慎使用。谨慎使用该指令当然可以提高我们编写的代码的可读性,但一定要考虑使用它的上下文,以避免编写可读性较差的代码的风险。
要了解有关使用指令的更多信息,请参阅以下链接:</font
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~