首页 > 编程语言 >C#、TS和Dart对比2:变量和作用域

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

时间:2023-01-12 01:34:12浏览次数:48  
标签:Console 变量 作用域 TS a1 C# int a2

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

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; //类型推断为number

console.log(a1,a2,a3,a6); //1 2 4 1

 

3、Dart

//Dart中的变量和函数也是顶级成员和一等公民,可以在全局定义和使用
//main函数是程序入口函数
void main(List<String> 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
            }
        }
    }
}

 

标签:Console,变量,作用域,TS,a1,C#,int,a2
From: https://www.cnblogs.com/functionMC/p/17045305.html

相关文章

  • Luogu P5465 [PKUSC2018] 星际穿越
    观察可以发现一个结论,可以视作每个点\(i\)可以一步到达\(l_i\simn\)的每一个点。发现对于\(a<b<x\),\(dist(a,x)\gedist(b,x)\)第一步是相当特殊的,因为第一步......
  • 3. Longest Substring Without Repeating Characters [Medium]
    3.LongestSubstringWithoutRepeatingCharactersGivenastrings,findthelengthofthelongestsubstringwithoutrepeatingcharacters.Constraints:0<=s......
  • Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
    转载请注明出处:1.Promise的then方法使用then方法是 Promise中处理的是异步调用,异步调用是非阻塞式的,在调用的时候并不知道它什么时候结束,也就不会等到他......
  • 配置正确但是 Aria2 RPC 服务器错误解决方案
    适用于Windows系统(Linux/MacOS也不会遇到这些问题吧……)检查hosts文件中是否为127.0.0.1设置别名localhost(可将Aria2JSON-RPC地址的localhost改为127.0.0......
  • nat是干什么的,为什么要有nat?以及谈谈ovs里使用ct实现nat功能
    博客竟然不显示更新的时间,只有个发布时间。看起来像2个月没更新一样,其实更新了几行呢。好几个东西想理一下,本来想和周记放一起了,但放一起就没有主题了。当然一搜也有一些......
  • 3.IOC控制反转
    IOC本质  控制反转loc(lnversionofControl),是一种设计思想,DI(依赖注入)是实现loC的一种方法,也有人认为DI只是IOC另一种说法。没有IOC的程序中,我们使用面向对象编程,对象......
  • 回家倒数五天,ic人加油
    实习一个月了。感觉学会了不少东西,我要坚持做到总结${\color{Blue} \left|a\right|\leqslantb\Rightarrow-b\leqslanta\leqslant\left|b\right|} $ ......
  • 两台 mac 通过 scp 命令快速传输数据
    这两天由于电脑进水了,所以申请换了一台mac电脑,所以想把老电脑的数据拷贝到新电脑,折腾了半天,最后还是发现scp命令最好用。使用「scp命令方式」之前尝试的其他方法1......
  • TCP
    TCP传输控制协议(TCP,TransmissionControlProtocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议 一.TCP的客户端和服务端客户端:客户也......
  • CobaltStrike权限提升
    BypassUAC  UAC是微软在WindowsVista以后版本引入的一种安全机制,通过UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系......