6.2  变量的作用域

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

  在上一节中,读者可能想知道为什么需要利用函数交换数据。原因是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(); }
}

  编译代码,注意显示在任务列表中的错误和警告:

当前上下文中不存在名称“myString”【The name   'myString'   does not exist in the current context】
变量“myString”已赋值,但其值从未使用过【The variable 'myString' is assigned but its value is never used】

  什么地万出错了?不能在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()把控制权传送给Wri。
    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关键字。在这种类型的控制台应用程序中,必须使用static或const关键字,来定义这种形式的全局变量。如果要修改全局变量的值,就需要使用static,因为const禁止修改变量的值。

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

  是否使用全局变量取决于函数的位置。使用全局变量的问题在于,它们通常不适合于“常规用途”的函数——这些函数能处理我们所提供的任意数据,而不仅限于处理特定全局变量中的数据。

6.2.1  其他结构中变量的作用域

  变量的作用域包含定义它们的代码块和直接嵌套在其中的代码块。这也可以应用到其他代码块上,例如分支和循环结构的代码块。考虑下面的代码:

int i;
for (i = 0; i < 10; i++)
{ string text = "Line " + Convert.ToString(i); Console.WriteLine("{0}", text);
}
Console.WriteLine("Last text output in loop: {0}", text); 

  字符串变量text 是for 循环的局部变量,这段代码不能编译,因为在该循环外部调用的Console.WriteLine()试图使用该变量text,这超出了循环的作用域。修改代码,如下所示:

int i;
string text;
for (i = 0; i < 10; i++)
{ text = "Line " + Convert.ToString(i); Console.WriteLine("{0}", text);
}
Console.WriteLine("Last text output in loop: {0}", text);

  这段代码也会失败,原因是必须在使用变量前对其进行声明和初始化,而text 是在for循环中初始化的。赋给text的值在循环块退出时就丢失了。但是还可以进行如下修改:

int i;
string text = "";
for (i = 0; i < 10; i++)
{ text = "Line " + Convert.ToString(i); Console.WriteLine("{0}", text);
}
Console.WriteLine("Last text output in loop: {0}", text); 

  只声明一个简单变量类型,并不会引起其他的变化。只有在给变量赋值后,这个值才占用一块内存空间。如果这种占据内存空间的行为在循环中发生,该值实际上定义为一个局部值,在循环的外部会超出了其作用域。

  即使变量本身没有局部化到循环上,循环所包含的值也局部化到该循环上。但是,在循环外部赋值可以确保该值是主体代码的局部值,在循环内部它仍处于其作用域中。这意味着变量在退出主体代码块之前是没有超出作用域的,所以可以在循环外部访问它的值。

  最后一个要注意的问题是,应采用“最佳实践方式”。一般情况下,最好在声明和初始化所有变量后,再在代码块中使用它们。一个例外是把循环变量声明为循环块的一部分,例如:

for (int i = 0; i < 10; i++)
{ ...
}

转载于:https://www.cnblogs.com/wodehao0808/p/4912236.html

(原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域相关推荐

  1. STM32中断回调函数定时器-STM32电控学习笔记06

    STM32中断&定时器-STM32电控学习笔记06 day6:2022/9/24 [中断概述] 在 STM32 中,对信号的处理可以分为轮询方式和中断方式,轮询方式就是不断去访问一个信号的端口 ...

  2. opencv学习笔记06

    原创:opencv学习笔记06 OpenCV-Python教程:50.理解k-近邻 https://www.jianshu.com/p/404e329e4e80 OpenCV里的kNN 1 2 3 4 ...

  3. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  4. JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  5. JavaWeb-综合案例(用户信息)-学习笔记06【复杂条件查询功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  6. JavaScript学习笔记06【高级——JavaScript中的事件】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  7. MySQL学习笔记06【多表查询、子查询、多表查询练习】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  9. php中声明一个函数,php学习笔记之 函数声明

    /* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...

  10. MySQL学习笔记—自定义函数

    MySQL学习笔记-自定义函数 注释语法: MySQL服务器支持3种注释风格: 从'#'字符从行尾. 从'– '序列到行尾.请注意'– '(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如 ...

最新文章

  1. 按下enter键在各个文本框中切换焦点_你真的了解Enter键吗?请先学习本文后再回答...
  2. python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库
  3. 机器学习算法1_线性回归
  4. 检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)
  5. QT的QDesignerPropertyEditorInterface类的使用
  6. (二) :JS 生成随机数字母和数字
  7. vue报错vue-router.esm.js?8c4f:2062 Uncaught (in promise) Error: Avoided redundant navigation to curren
  8. tablemodel dapter区别
  9. [转] 我回答了90%的面试题,为什么还被拒?
  10. mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码
  11. 全网最详细的docker配置nginx http2 优化高速访问
  12. postman发送Post请求
  13. queue,stack中的库函数
  14. 金融理财软件测试项目,大学生创新创业大赛金融理财项目创业计划书18-23-879(15页)-原创力文档...
  15. 微信小程序获取access_token报错errcode: 40125,errmsg: invalid appsecret
  16. 不负韶华 只争朝夕(2019年终报告)
  17. 万达电商为何刻意回避阿里与马云
  18. AndroidStudio简单代码实现BMI计算
  19. 使用.NET 将PDF转成Word
  20. 抑制细胞代谢紊乱的抑制剂

热门文章

  1. VMware Workstation 运行出现“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”解决方案
  2. Leetcode刷题(6)有效的括号
  3. 前端学习(3154):react-hello-react之脚手架文件介绍
  4. 工作392-选择Hbuilder x导入项目
  5. PS教程第二课:PS安装
  6. [vue] 说说你对Object.defineProperty的理解
  7. oracle之数据处理2
  8. 前端学习(1429):ajax封装四
  9. 前端学习(1047):todolist删除数据2
  10. 前端学习(932):mouseenter和mouseover区别