C#、TS和Dart对比1:概述和目录
一、为什么要三门语言一起学?
- 多门语言一起学习,有利于提升语言学习的触类旁通能力。现代开发语言非常丰富,很多应用场景或问题的解决,需要多种语言配合,有了触类旁通的学习能力,当需要接触一门新语言时,上手会比较快。另外,由于不同语言的相似性,多种语言开发时,会经常短路错位,这里也算是一个快速查询的目录。
二、为什么选了C#、TS和Dart?
- 完全基于实用主义。作为个人开发者和小微团队,基本上都需要全栈开发。而基于C#的.NET是后端的最优选之一,而前端框架使用过Blazor、WPF/MAUI、Vue、Flutter和小程序,所以选了C#、TS和Dart。
三、简单说一下C#、TS和Dart这三门语言?
- C#是完全面向对象的强类型语言,对标的语言是Java,无论语法还是底层原理,都非常相似。性能以及语法特性上,C#是能够胜过Java的,但在使用的广泛度上,C#明显要弱于Java,尤其是在国内。两者都主要用于后端开发,但也都有涉及前端。而C#的前端框架非常丰富,包括MVC、Blazor、winform、WPF、MAUI等。
- TS是JS的超级。TS在JS原型对象的基础上,扩展了静态类型、类、接口、泛型、联合类型等功能,使JS在开发环节具备了完全面向对象语言的特性,非常有利于构建大型应用。但在运行时,仍然是通过编译器将TS转译为JS执行,本质上还是JS。现代前端UI框架,如Vue、React等,都已全面转向TS(javascript的后端框架nodejs,也已支持TS)。
- Dart结合了面向对象语言(如C#/Java)和JS的特性,如静态类型、类、接口(使用抽象类实现)、泛型等,接近于C#/Java;而变量和函数又都是顶级成员(可以在类以外的全局定义和使用),接近于JS。同时,Dart支持JIT和AOT两种编译模式,在开发阶段使用JIT,能有效提升开发效率(编译速度和热重载),而在部署阶段,通过AOT编译为目标平台的机器码,有dart2native(原生平台)和dart2js(javascript)两种方式。可以说,Dart兼顾了开发效率和运行性能。Dart目前主要用于Flutter跨平台前端UI框架,早期Dart作为JS的替代者出现,但现在可以说,它就是为Flutter而生的一门语言。
四、一些基本概念的命名规范。三种语言对类似概念有不同的命名,对类似概念统一命名,将有助于多语言的学习和使用
1、在全局作用域中(仅TS和Dart):
- TS和Dart存在全局作用域。但是,C#不存在全局作用域,所有数据都必须在类中定义和使用。
- 在全局作用域中,定义的变量,称之为全局变量;定义的常量,称之为全局常量 ;定义的函数,称之为函数。
2、在类中(C#、TS、Dart):
- 属性:在类中定义的变量或常量,称之为属性。我们知道在C#中,会称之为字段,但之后统一称之为属性。对于变量和常量的区别,可以变量属性和常量属性加以区分。
- 方法:在类中定义的函数,称之为方法。
- 构造方法:在类中定义的特殊函数,在实例化对象时自动调用,主要用于属性的初始化。在C#中还存在一个析构方法,非常少使用,不会介绍。
- 属性存取器:通过定义getter和setter方法,对私有属性进行读取和修改。我们知道在C#中,会称之为属性,虽然有非常方便的语法糖,实质还是“私有属性+存取器”的组合,之后统一称之为属性存取器。
3、在函数/方法的局部作用域中(C#、TS、Dart):
- 函数/方法通过{}符,划分出局部作用域。
- 在局部作用域中,定义的变量,称之为局部变量;定义的常量,称之为局部常量。
- 函数/方法的参数是比较特殊的变量,定义时称之为形参,调用时称之为实参。
4、在TS对象中(仅TS)(不是与实例相对应的那个“对象”概念,所以称之为“TS对象”加以区分):
- TS中存在特殊的对象数据类型,以{key1:value1,key2:value2......}形式表示。
- TS对象中的变量成员,称之为对象属性。
- TS对象中的函数成员,称之为对象方法。
5、函数变量
- TS和Dart中,函数也是一种数据类型,所以可以直接作为函数的参数。
- C#中,要实现类似功能,需要使用委托。委托与类是同一层级的概念,需要先定义委托类型,然后再定义委托变量,但绝大多数情况下,我们使用C#为我们提前定义好的泛型委托Action和Func来创建委托变量。
- 从实用主义出发,之后在TS、Dart、C#中,当我们定义一个函数类型的变量时,统一称之为函数变量。其实,如果你从TS/Dart的角度去理解委托,会更简单;从C#本身的语言特征去理解,反而复杂了。
五、会有深入原理性的内容吗?
- 比较少。一是怕讲不好;二是我认为掌握了使用,原理层面的东西大概就知道七七八八了,而剩下的20%,通过看不同的文章和案例,以及日后实际开发过程中,接触到不同的开发框架时,会一下顿悟。
六、会有全面的知识点吗?
- 不会。一是对于同一个功能有多种表达的情况,可能只会根据自己的习惯,提供一种表达方式;二是会追求尽量简洁的表达,能用代码表达的,就不用文字;三是这里不是文档的重复。
七、使用什么学习环境?统一使用Visual Studio Code
- C#:①安装.NET SDK,如果已安装Visual Studio,则不需要再安装SDK,在命令行的任意目录下,输入【dotnet -h】命令验证是否安装成功;②运行vscode,安装C#、C# Extensions插件;③终端输入【dotnet new console】命令,初始化一个控制台项目。入口文件为Program.cs,如果使用了顶级语句,建议改回显式的Program类和Main方法;④终端输入【dotnet run】命令,运行项目。
- TS:①安装node.js(登陆官网下载nodejs.org);②运行vscode,打开终端,输入【npm config set registry https://registry.npm.taobao.org】命令,设置npm镜像;③继续在终端中,输入【cnpm install -g typescript】命令,全局安装typescript;④继续在终端中,输入【tsc --init】,生成typescript配置文件tsconfig.json,终端再输入【tsc --watch】命令;⑤新建index.ts,保存后会自动转译一个index.js文件,如未自动保存,可执行【tsc index.ts】命令;⑥在终端中,输入【node index.js】命令,运行项目。
- Dart:①安装Dart SDK,使用命令行或者下载Dart for Windows安装包,安装完后,在命令行的任意目录下,输入“dart --version”;②运行vscode,安装dart、Code Runner插件;③创建index.dart文件(文件名可随意),输入入口函数【void main(){}】;④右击run code(或者Ctrl+alt+N快捷键)运行,或者终端输入【dart run index.dart】命令运行。
- PS1:VSCode的常规操作,如打开项目、新建文件夹、新建文件、打开终端命令行等操作,自行查阅相关文档。
- PS2:如果在VSCode终端,执行tsc等命令出错,有可能是执行策略的设置问题。以管理员身份打开Windows PowerShell,执行【set-ExecutionPolicy RemoteSigned】命令,选择Y。
- 效果如下:
**********七、目录**********
1 概述和目录
2 变量和作用域
4 类型
4.1 类型概述
4.2 基本类型:数值
4.3 基本类型:布尔
4.4 基本类型:字符/字符串
4.5 集合类型:列表类(Array、List、Set、Tuple)
4.6 集合类型:键值对类(Dictionary、Map、object)
4.7 枚举类型
4.8 特殊类型
4.9 TS对类型的扩展(类型别名、联合类型、交叉类型)
5 函数/方法
5.1 函数的声明和调用
5.2 函数的返回值
5.3 函数的参数
5.4 闭包和委托捕获
5.5 扩展方法
5.6 函数变量和委托
5.7 函数指针
6 表达式、运算符和语句
6.1 表达式和字面量
6.2 运算符
6.3 特殊运算符
6.4 运算符重载
6.5 判断和循环语句
7 类基础
7.1 类的声明和使用
7.2 类的成员-属性
7.3 类的成员-方法
7.4 访问修饰符
7.5 构造函数
7.6 静态成员和实例成员
7.7 嵌套类和部分类
7.8 结构体
8 类高级
9 接口
10 泛型
11 异步
12 事件
13 常用类库
13.1 日期
13.2 RegExp
13.3 JSON
13.4 迭代集合
13.5 文件操作
13.6 Web请求
14 其它
14.1 类型转换
14.2 多维数组
14.3 异常处理
14.4 反射特性-C#
14.5 装饰器-TS
14.6 元数据-Dart
14.7 索引器-C#
14.8 协变和逆变-C#
14.9 原型链-TS
14.10 并发isolate-Dart
......