最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

C#、TS和Dart对比2:变量和作用域

来源:博客园

一、变量的声明、赋值和类型推断


(资料图片)

1、C#

//C#是完全面向对象语言,所有代码都必须在类中//Program类的Main方法,是程序的入口函数public class Program{    static void Main(string[] args)    {        int a1; //声明变量        a1 = 1; //变量赋值                int a2 = 2; //声明变量时初始化        int a3 = a2*2; //初始化时,可以使用表达式进行运算        /*        以下代码报错,使用变量a4时,未被赋值。变量使用前,必须已赋值        int a4;         int a5 = a4*3;                */        var a6 = 1; //类型推断,编译器自动推断a5类型为int        Console.WriteLine(a1); //1        Console.WriteLine(a2); //2        Console.WriteLine(a3); //4        Console.WriteLine(a6); //1    }}

2、TS

//TS中,变量和函数都是顶级成员和一等公民,可以在全局定义和使用let a1:number;a1 = 1;let a2:number = 2;let a3:number = a2*2;/*以下代码报错let a4:number;let a5:number = a4*3;*//*TS中定义变量可以使用var或let但var和JS中一样,存在变量提升和作用域的问题,不建议使用所以在TS中,定义变量,推荐使用let*/let a6 = 1; //类型推断为numberconsole.log(a1,a2,a3,a6); //1 2 4 1

3、Dart

//Dart中的变量和函数也是顶级成员和一等公民,可以在全局定义和使用//main函数是程序入口函数void main(List args) {  int a1;  a1 = 1;  int a2 = 2;  int a3 = a2 * 2;  /*以下代码报错  int a4;  int a5 = a4 * 2;  */  var a6 = 1; //类型推断为int类型,和C#一样,使用var关键字  print(a1); //1  print(a2); //2  print(a3); //4  print(a6); //1}

4、总结:值以二进制形式储存在内存中,理论上可以通过内存地址访问,但对开发来说,这不现实。变量相当于内存地址的别名,通过变量就可以方便的进行值的访问和操作。

二、作用域

1、几乎所有语言,都以中括号{}来划分作用域,如上例中C#和Dart。TS代码暂时没有出现{},但隐式存在一个全局使用域。其实Dart也存在一个全局作用域,可以在main函数之外,像TS一样定义变量。如【int a = 1;void main(){};】。

2、作用域可以嵌套作用域,如上例中的C#,有两个作用域【class program{ Main(){} }】。

3、当存在作用域嵌套时,内层作用域可以使用外层作用域的变量,反过来则不行。

4、内层作用域使用变量时,会先从当前作用域找,如果找不到,则向外逐层开始找,如果到最外层还找不到,则报错-变量未定义或赋值。

5、有一个形象的比喻,作用域就是汽车的隐私玻璃,里面可以看到外面,但外面看不到里面。

6、以C#为例说明,TS和Dart的作用域原理基本一样。注:TS作用域有效的前提是使用let声明变量,如果使用var,存在变量提升和作用域的问题。

public class Program{    static void Main(string[] args)    {        int a1 = 1;        Console.WriteLine(a1); //1        //Console.WriteLine(a2); 报错,无法看到内层作用域的变量        //Console.WriteLine(a3); 报错,无法看到内层作用域的变量        {            int a2 = a1*2; //当前作用域找不到a1时,向外层作用域找a1,找到a1=1            Console.WriteLine(a1); //1,在外层作用域找到a1            Console.WriteLine(a2); //2,在当前作用域找到a2            //Console.WriteLine(a3); 报错,无法看到内层作用域的变量            {                int a3 = a1*3; //当前作用域找不到a1时,逐层向外层作用域找a1,找到a1=1                Console.WriteLine(a1); //1,在外层作用域找到a1                Console.WriteLine(a2); //2,在外层作用域找到a2                Console.WriteLine(a3); //3,在当前作用域找到a3            }        }    }}

关键词: 可以使用 变量提升