了解 C# 中的作用域和可见性
介绍
在本指南中,我们将讨论 C# 中的两个关键概念:可见性和作用域。大多数编程语言都包含这两个概念。它们规划了数据所在的结构并显示了允许数据流动的方向。首先,我们将深入探讨作用域,然后将目光转向可见性。
范围
此概念定义了应用程序中可访问变量的部分,称为变量的作用域。变量可以在类、方法、循环和结构中定义。
变量有三个主要作用域:
- 级别
- 方法级别
- 块级别(嵌套范围)
级别
让我们创建一些代码来演示这一点。
using System;
namespace Pluralsight
{
public class ClassLevel
{
int a = 6;
string b = "This is a string";
void ex() {
double c = 10.0;
Console.WriteLine($"The value c is {c}");
}
public static void Main()
{
ClassLevel a = new ClassLevel();
Console.WriteLine($"The value a is {a.a}");
Console.WriteLine($"The value b is {a.b}");
ClassLevel.ex();
Console.ReadKey();
}
}
}
输出如下。
The value a is 6
The value b is This is a string
The value c is 10
当我们在任何方法之外声明类中的变量时,它可以在类中的任何位置访问,就像我们上面的两个变量a和b一样。当您以这种方式定义变量时,它们被称为字段或类成员。类级别范围的变量(例如我们例子中的c)只能由定义它们的类的非静态方法访问。如果我们为类级变量定义访问修饰符,它不会影响其在类中的作用域。访问修饰符提供从类外部对字段的访问。
方法级别
让我们创建一个示例来演示这一点。
using System;
namespace Pluralsight
{
public class MethodLevel
{
double c;
void first() {
double c = 10.0;
Console.WriteLine($"The value c is {c}");
}
void second() {
Console.WriteLine($"The value c is {c}");
}
public static void Main()
{
MethodLevel a = new MethodLevel();
Console.WriteLine($"The value c is {a.c}");
a.first();
a.second();
Console.ReadKey();
}
}
}
输出如下。
The value c is 0
The value c is 10
The value c is 0
这演示了方法如何封装它们自己的命名空间和在其中定义的变量。我们可以看到在这种情况下c的值的打印有何不同。每当我们在方法内定义一个变量时,它都会被分配方法级别范围。并且我们无法在该方法之外访问它。此变量不能覆盖或被更高范围中同名的变量覆盖。这些变量称为局部变量。我们不能在同一范围内用相同的名称声明它们两次。执行该方法后,变量将不复存在,因为它们会被贪婪的垃圾收集器收集。
块级别
我们也可以通过一个例子来证明这一点。
using System;
namespace Pluralsight
{
public class BlockLevel
{
public static void Main()
{
double roentgen = 3.6;
if (roentgen >=3.6)
{ string message = "Not great, not terrible!"; }
else
{ string message = "Well, could be worse!"; }
Console.WriteLine($"Status report: {message");
Console.ReadKey();
}
}
}
上述代码无法编译或执行。编译器分两个阶段指出此问题。我们收到的第一条消息是消息变量的值已声明但从未使用过,第二条消息是消息变量在当前上下文中不存在。
我们可以通过修改消息使其不再是if中声明的字符串来规避这个问题,而是将其带入Main()函数的范围或使其成为类字段。
这些变量通常在for或while循环内声明时很有用。有时它们被称为循环变量,因为它们的作用域有限。当您在循环外声明变量时,它仍然可以在嵌套循环内访问,这意味着类级别变量也可以供方法和循环访问。方法级别变量可供方法和循环访问。在循环体内声明的变量将无法从更高的作用域访问。
能见度
当我们谈论可见性时,我们需要考虑类、方法和变量构造。可见性告诉我们如何访问这些项目。
可见性有五种类型:
- 民众
- 受保护
- 内部的
- 受保护的内部
- 私人的
民众
这是最宽容的可见性类型。以这种方式定义的成员可以从任何地方访问,默认情况下枚举和接口是公共的。
受保护
以这种方式指定的成员只能从同一个类或类内部访问。
内部的
仅可从同一项目联系到以此方式指定的成员。
受保护的内部
以这种方式指定的成员只能从同一个项目以及从该类继承的类甚至从另一个项目访问。
私人的
以此方式指定的成员只能由同一类的其他成员访问。默认情况下,类和结构设置为此可见性级别,这是最严格的。
让我们创建一个小的演示代码。
using System;
namespace Pluralsight
{
public class AnotherVisibility {
public string message = "I am visible from anywhere!";
protected string pmessage = "Only from the same class!";
internal string imessage = "I am visible only from within the same project!";
private string ppmessage = "Untouchable!";
public void ProtectedMessage() {
Console.WriteLine(pmessage);
Console.WriteLine(ppmessage);
}
}
public class Visibility : AnotherVisibility
{
public static void Main()
{
Visibility a = new Visibility();
AnotherVisibility b = new AnotherVisibility();
Console.WriteLine(a.message);
Console.WriteLine(a.imessage);
Console.WriteLine(a.pmessage);
b.ProtectedMessage();
Console.ReadKey();
}
}
}
输出如下。
I am visible from anywhere!
I am visible only from within the same project!
Only from the same class!
Only from the same class!
Untouchable!
这里我们可以看到概念的实际应用。我们的消息变量是公共的,因此可以从任何地方访问。我们有pmessage变量,可以从相同或继承的类访问。我们有imessage变量,可以从相同或继承的类访问。我们还有ppmessage变量,只能从原始类访问。
结论
在本指南中,我们阐明了范围和可见性的概念。通过实际示例,我们了解了如何编写更高效、更易于维护的代码。起初,学习使用这些概念需要一些时间,但后来它们会成为你的第二天性。我希望本指南对你有所帮助,并感谢你阅读它!
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~