• C# 变量作用域


    变量作用域是一个让很多初学者很容易混淆的一个概念。

    变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域遵循以下规则:

    只要类在某个作用域中,其字段也(也称成员变量)也在该作用域内。

    • 局部变量存在于表示声明该变量的块语句或方法结束的右花括号({})之前的作用域内。(请认真解读读透这句话)
    • 在for、while或类似语句中声明的局部变量存在于该循环体内。
    1. 局部变量的作用域冲突

    大型程序在不同部分的变量使用相同的变量名很常见。只要变量的作用域是程序的不同部分,就不会有问题,就不会产生多义性。但请注意,同名的局部变量不能在统一作用域声明两次。例子如下:

    public static int Main(){
    int j=20;
    for(int i=0;i<10;i++){
      int j=30;
      Console.WriteLine(j+i);
      }
    }

    编译时提示的错误如下:

    First.cs(24,10): error CS0136:
    不能在此范围内声明名为“j”的局部变量,因为这样会使“j”具有不同的含义,而它已在“父级或当前”范围中表示其他内容了。

    根据变量的作用域遵循的原则(局部变量存在于声明该变量的块语句或方法结束的右花括号({})之前的作用域内),第一个变量j是在for循环开始前定义的,它的作用域是Main()方法;第二个变量的作用域是在for循环;第一个变量j的作用域包含了第二个j的作用域。对编译器来说会存在歧义,因为编译器无法区分这两个变量,所以不允许声明第2个 变量。

         2.字段和局部变量的作用域冲突

    某些情况下,可以区分名称相同、作用域相同的两个标志符。此时编译器允许声明第2个变量。原因是C#在变量之间有一个基本的区分,他把类级别声明的变量看作字段(成员变量),而把方法中声明的变量看作局部变量。例子如下:

    using System;
    namespace Wrox
    {
      class	ScopeTest{
      public int j=20;
      public static void Main(){
    		int j=30;
    		Console.WriteLine(j);
    		return;
    		}
    	}
    }
    

    虽然在Main()方法中作用域中声明了两个变量,这段代码会正常编译。第一个j的作用域是这个ScropeTest类,第一个为Main()方法。此时,在Main()方法中声明的变量隐藏了同名的类级变量,所以这段代码,会显示数字为30。倘若要引用类级变量,可以使用语法object.fieldname.看如下代码:

    using System;
    namespace Wrox
    {
      class	ScopeTest{
      public int j=20;
      public static void Main(){
    		int j=30;
    		Console.WriteLine(j);
    		ScopeTest obj=new ScopeTest();
    		Console.WriteLine("类级变量是:"+obj.j);
    		return;
    		}
    	}
    }

    可以选择将字段声明为 static。这使得调用方在任何时候都能使用字段,即使类没有任何实例。Demo如下:

    using System;
    namespace Wrox
    {
      class    ScopeTest{
      static int j=20;
      public static void Main(){
            int j=30;
            Console.WriteLine(j);
            // ScopeTest obj=new ScopeTest();
            Console.WriteLine("类级变量是:"+ScopeTest.j);
            return;
            }
        }
    }
  • 相关阅读:
    TypeScript——04——ts中的接口(Interface)
    TypeScript——02——TS基本数据类型介绍和使用
    TypeScript——01——简介以及安装使用
    事件循环 EventLoop(Promise,setTimeOut,async/await执行顺序)
    【vue】vue生命周期---精简易懂-----【XUEBIG】
    【Vue】-- 数据双向绑定的原理 --Object.defineProperty()
    【nodejs】--express的中间件multer实现图片文件上传--【XUEBIG】
    【H5】-- FormData用法介绍以及实现图片/文件上传--【XUEBIG】
    CommonJs规范详解---【XUEBIG】
    从输入 URL 到页面加载完成的过程详解---【XUEBIG】
  • 原文地址:https://www.cnblogs.com/iloney/p/4149949.html
Copyright © 2020-2023  润新知