变量的作用域 3个月前

编程语言
753
变量的作用域

在上一节中,读者可能想知道为什么需要利用函数交换数据。原因是C#中的变量仅能从代码的本地作用域访问。给定的变量有一个作用域,在这个作用域外是不能访问该变量的。

变量的作用域是一个重要主题,最好用一个示例加以说明。下面的示例将演示在一个作用域中定义变量,但视图在另一个作用域中使用该变量的情形。

class Program
{
    static void Write()
    {
        Console.WriteLine("myString = {0}", myString);  ❌
    }

> static void Main(string[] args)
{
    string myString = "String defined in Main()";
    Write();
    Console.ReadKey();
}
}

示例的说明 什么地方出错了?不能在 Write() 函数中访问在应用程序主体(Main() 函数 )中定义的变量 myString。 原因是变量是有作用域的,在这个作用域中,变量才是有效的。这个作用域包括定义变量的代码块和直接镶嵌在其中的代码块。函数中的代码块与调用它们的代码块是不同的。在 Write() 中,没有定义 myString,在 Main() 中定义的 myString 则超出了作用域--它只能在 Main() 中使用。

实际上,在 Write() 中可以有一个完全独立的变量 myString。修改代码,如下所示:

class Program
{
    static void Write()
    {
        string myString = "String defined in Write()";
        Console.WriteLine("Now in Write()");
        Console.WriteLine("myString = {0}", myString);
    }

static void Main(string[] args)
{
    string myString = "String defined in Main()";
    Write();
    Console.WriteLine("\nNow in Main()");
    Console.WriteLine("myString = {0}", myString);
    Console.ReadKey();
}
}

这段代码执行的操作如下:

  • Main() 定义和初始化字符串变量 myString
  • Main() 把控制权传给 Write()
  • Write() 定义和初始化字符串变量 myString,它与 Main() 中定义的 myString 变量完全不同。
  • Write() 把一个字符串输出到控制台上,该字符串包含在 Write() 中定义的 myString 的值。
  • Write() 把控制权传送回 Main()
  • Main() 把一个字符串输出到控制台上,该字符串包含在 Main() 中定义的 myString 的值。

其作用域以这种方式覆盖一个函数的变量称为局部变量。还有一种全局变量,其作用域可覆盖多个函数。修改代码,如下所示:

class Program
{
    static string myString;

> static void Write()
{
    string myString = "String defined in Write()";
    Console.WriteLine("Now in Write()");
    Console.WriteLine("Local myString = {0}", myString);
    Console.WriteLine("Global myString = {0}", Program.myString);
}

> static void Main(string[] args)
{
    string myString = "String defined in Main()";
    Program.myString = "Global string";
    Write();
    Console.WriteLine("\nNow in Main()");
    Console.WriteLine("Local myString = {0}", myString);
    Console.WriteLine("Global myString = {0}", Program.myString);
    Console.ReadKey();
}
}

这里添加了另一个变量 myString,这次进一步加深了代码中的名称层次。这个变量定义如下:

static string myString;

注意 ⚠️,这里也需要 static 关键字。在此类控制台应用程序中,必须使用 staticconst 禁止修改变量的值。

为区分这个变量和 Main()Write() 中的同名局部变量,必须用一个完整限定的名称为变量名分类,参见第 3 章。这里把全局变量称为 Program.myString。注意 ⚠️,在全局变量和局部变量同名时,才需要这么做。如果没有局部 myString 变量,就可以使用 myString 表示全局变量,而不需要使用 Program.myString。如果局部变量和全局变量同名,会屏蔽全局变量。

全局变量的值在 Main() 中设置如下:

Program.myString = "Global string";

Write() 中可以通过如下语句访问:

Console.WriteLine("Global myString = {0}", Program.myString);

为什么不能使用这个技术通过函数交换数据,而要使用前面介绍的参数来交换数据?有时,这确实是一种交换数据的首选方式,但许多情况下不应使用这种方式。是否使用全局变量取决于函数的用途。使用全局变量的问题在于,它们通常不适合于 “常规用途”的函数--这些函数能处理我们所提供的任意数据,而不仅限于处理特定全局变量中的数据。

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2222820
累计阅读

热门教程文档

Linux
51小节
Javascript
24小节
Golang
23小节
Spring Boot
24小节
QT
33小节