前面已经展示了一些在方法内部创建变量的例子。变量从定义了它的语句开始存在,同一个方法内的后续语句可以使用该变量。换言之,变量只能在创建了之后才能使用。方法执行完毕后,变量也会彻底消失。

假如一个变量能在程序中的一个特定位置使用,就说明该变量具有那个位置的作用域。也就是说,一个变量的作用域(scope)是指能够使用该变量的程序区域。作用域既作用于方法,也作用于变量。一个标识符(不管它代表变量还是代表方法)的作用域是从声明明该标识符的那个位置开始的。

定义局部作用域

界定方法主体的起始与结束大括号建立了一个作用域。方法主体中声明的任何变量都具有那个方法的作用域;一旦方法结束,它们也会消失,而且只能由那个方法内部执行的代码来访问。这些变量称为局部变量(local variable),因为它们局限于声明它们的那个方法,不能在其他任何方法的作用域中使用。换言之,你不能使用局部变量在不同的方法之间共享信息。例如:
 
class Example
{
    void firstMethod()
    {
        int myVar;
        ...
    }
    void anotherMethod()
    {
        myVar = 42; // 错误 – 变量越界
        ...
    }
}

上述代码将编译失败,因为anotherMethod方法试图使用一个越界的myVar变量。该变量只能由firstMethod方法中的语句使用。

定义类作用域

界定类主体的起始和结束大括号也建立了一个作用域。在类主体中(但不在一个方法中)声明的任何变量都具有那个类的作用域。在C#术语中,开发者使用字段(field)一词来描述由一个类定义的变量。和局部变量不同,你可以使用字段在不同的方法之间共享信息。    例如:
 
class Example
{
    void firstMethod()
    {
        myField = 42; // ok
        ...
    }
    void anotherMethod()
    {
        myField = 42; // ok
        ...
    }
    int myField = 0;
}

变量myField是在类的内部以及firstMethod和anotherMethod方法的外部定义的。所以,myField具有类的作用域,可由类中的所有方法使用。

这个例子中还需要注意另一点。在一个方法中,必须在使用一个变量前声明它。但字段稍有不同,一个方法能在定义一个字段的语句之前使用那个字段——在这种情况下,编译器将为你打点一切!

重载方法

如果两个标识符同名,而且在同一个作用域中声明,就可以说它们被重载(overloaded)。通常,重载的标识符属于一个程序bug,会在编译时被捕捉到并报错。例如,假定你在同一个方法中声明了两个同名的局部变量,就会获得一个编译时错误。类似地,假如在同一个类中声明了同名的两个字段,或者在同一个类中声明了两个完全一样的方法,就会获得一个编译时错误。这个事实表面上似乎不值一提,因为一切都会被报告为编译时错误。然而,你确实能通过一种方式来重载标识符,而且这种重载不仅是有用的,而且是重要的。

以Console类中的WriteLine方法为例,前面已经使用该方法向屏幕输出一个字符串。然而,在“代码和文本编辑器”窗口中输入WriteLine时,会自动弹出一个“智能感知”列表,其中列出了19个不同的版本!WriteLine方法的每个版本都获取一套不同的参数。一个实现不获取任何参数,只是输出一个空行;另一个实现则获取一个bool参数,并输出它的值的字符串形式(true或false);还有一个实现获取一个小数值,并以字符串的形式输出它;等。程序编译时,编译器会检查所传递的实参的类型,然后调用参数集与之匹配的一个方法版本。下面是一个例子:
 
static void Main()
{
    Console.WriteLine("The answer is ");
    Console.WriteLine(42);
}

如果需要针对不同的数据类型执行相同的操作,重载就是一项十分有用的技术。如果不同的实现有不同的参数集,就可以考虑重载一个方法。换言之,每个版本都具有相同的方法名,但具有不同的参数数量或者不同的参数类型。利用这个功能,在调用一个方法时,可以提供一个以逗号分隔的实参列表,而编译器将根据这些实参的数量和类型,选择其中的一个匹配的重载版本。但要注意,虽然可以重载一个方法的参数,但不能重载方法的返回类型。也就是说,不能声明只是返回类型有区别的两个同名方法(编译器虽然比较聪明,但还不至于聪明到那种程度)。

 

C# 运用作用域的更多相关文章

  1. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  2. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  3. JavaScript模仿块级作用域

    avaScript 没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子: function outputNumbers(count){ for ( ...

  4. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  5. js学习之变量、作用域和内存问题

    js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...

  6. ES6(块级作用域)

    我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...

  7. JavaScript基础学习-函数及作用域

    函数和作用域是JavaScript的重要组成部分,我们在使用JavaScript编写程序的过程中经常要用到这两部分内容,作为初学者,我经常有困惑,借助写此博文来巩固下之前学习的内容. (一)JavaS ...

  8. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

  9. JavaScript作用域

    JavaScript作用域 JavaScript作用域一直是前端开发的难题,现在只要用五句话就可解决. 一.“JavaScript中无块级作用域” 在Java或C#中存在块级作用域,即:大括号也是一个 ...

  10. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

随机推荐

  1. KVM虚拟机CPU绑定性能调优(宿主机上操作)

    获取kvm的pid ps -ef | grep kvm 通过pid找到vcpu在那个物理cpu上,没有绑定固定物理cpu时,执行下面命令可以看出vcpu在不同的物理cpu上切换重复执行 ps -eLo ...

  2. mitmproxy——抓取http、https

    mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler.Charles的功能.除了命令行形式的控制台,mitmproxy还有两个关联组件:mitmdump和mitmweb. ...

  3. jquery——下载、使用

    jQuery是目前使用最广泛的javascript函数库. 怎样安装? 这是下载地址:https://code.jquery.com/ minified是压缩版的 新建一个网页打开上面这个网址,ctr ...

  4. Spring Boot 整合 Hibernate5

    Run java -jar -Dspring.profiles.active=dev sport.web.services.jar Maven <parent> <groupId&g ...

  5. (转)CentOS 7系统详细开机启动流程和关机流程

    CentOS 7系统详细开机启动流程和关机流程 原文:http://blog.csdn.net/yuesichiu/article/details/51350654 名称 bootup - 系统启动流 ...

  6. Ceres Solver: 高效的非线性优化库(二)实战篇

    Ceres Solver: 高效的非线性优化库(二)实战篇 接上篇: Ceres Solver: 高效的非线性优化库(一) 如何求导 Ceres Solver提供了一种自动求导的方案,上一篇我们已经看 ...

  7. InteliJ idea import project 找不到文件结构解决办法

    一.按下列步骤操作:       1. 关闭IDEA,        2.然后删除项目文件夹下的.idea文件夹       3.重新用IDEA工具打开项目: 二.import新项目之后,可能需要等1 ...

  8. java 基础 03 运算符 分支结构 循环结构

    今天内容: (1)运算符 (2)分支结构 (3)循环结构 1运算符 1.1赋值运算符 (1)简单赋值 = 表示赋值运算符,用于将=右边的数据赋值给=左边的变量来覆盖原来的数值. 笔试题: ia == ...

  9. a标签常用跳转

    1.a标签跳转qq <a href="http://wpa.qq.com/msgrd?v=3&uin=123456789&site=qq&menu=yes&qu ...

  10. vue实现选中列表功能

    <template> <div> <ul v-for="prop in items"> <dt>{{prop.name}}</ ...