C# 是 TypeScript 的最佳替补?

开发 后端
TypeScript非常优秀。它完美地结合了强类型和快速开发,因此非常好用,我在许多情况下都会默认选择这个库。但是,世上没有完美的语言,有些情况下TypeScript并不是最合适的工具。

[[442462]]

TypeScript非常优秀。它完美地结合了强类型和快速开发,因此非常好用,我在许多情况下都会默认选择这个库。但是,世上没有完美的语言,有些情况下TypeScript并不是最合适的工具:

  • 性能至关重要(例如实时通信、视频游戏)
  • 需要与原生代码(如C/C++或Rust)交互
  • 需要更严格的类型系统(例如金融系统)

对于这些情况,TypeScript开发人员最好还是选用其他语言。C#、Go和Java都是非常好的选择。它们的速度远超 TypeScript,每种语言都有自己的长处。C#能与TypeScript配合得很好,我来解释一下为什么。

TypeScript 就是添加了 C# 的 JavaScript

C#能与TypeScript配合得很好,因为它们看上去就像是同一种语言。两者都是由Anders Hejlsberg设计的,而且从许多方面来看,TypeScript就是添加了C#的JavaScript。它们的特性和语法都很相似,因此在同一个项目中结合使用二者非常容易。更重要的是,C#的语言与TypeScript很相似,因此开发人员阅读和编写代码也非常轻松。

相反,Go是一种完全不同的语言:没有类,没有继承,没有异常,没有包级别的封装(只有类级别的封装),而且语法也完全不同。当然这并不一定是坏事,但开发人员的确需要重新思考并用不同的方式设计代码,因此,同时使用Go和TypeScript是比较困难的。不过,Java与C#很相似,但依然缺乏许多C#和TypeScript都有的功能。

C#和TypeScript的相似之处

也许你已经知道,C#和TypeScript有很多相似之处,如基于C的语法、类、接口、泛型等。下面,我来详细列举一下二者的相似之处:

  • async/await
  • lambda表达式和函数式数组方法
  • 用于处理空的操作符(?,!,??)
  • 解构
  • 命令行界面(CLI)

async/await

首先,C#和JavaScript都使用async/await来处理异步代码。在JavaScript中,异步操作用Promise表示,而应用程序可以await一个异步操作结束。C#中的Promise其实是Task,概念上与Promise完全相同,也有相应的方法。下面的例子演示了两种语言中async/await的用法:

 

  1. async function fetchAndWriteToFile(url: string, filePath:string): Promise<string> { 
  2.   // fetch() returns aPromise 
  3.   const response = awaitfetch(url); 
  4.   const text = awaitresponse.text(); 
  5.   // By the way, we'reusing Deno (https://deno.land) 
  6.   awaitDeno.writeTextFile(filePath, text); 
  7.   return text; 
  8. } 
  9.  
  10. using System.IO; 
  11. using System.Net.Http; 
  12. using System.Threading.Tasks;  
  13.  
  14. async Task<string> FetchAndWriteToFile(string url, stringfilePath) { 
  15.   // HttpClient.GetAsync()returns a Task 
  16.   var response = await newHttpClient().GetAsync(url); 
  17.   var text = awaitresponse.Content.ReadAsStringAsync(); 
  18.   awaitFile.WriteAllTextAsync(filePath, text); 
  19.   return text; 

下面是JavaScript的Promise API与等价的C# Task API:

Lambda表达式和函数式数组方法

C#和JavaScript都用熟悉的=>语法(即箭头函数)来表示lambda表达式。下面是TypeScript和C#的比较:

 

  1. const months = ['January''February''March''April']; 
  2. const shortMonthNames = months.filter(month => month.length< 6); 
  3. const monthAbbreviations = months.map(month =>month.substr(0, 3)); 
  4. const monthStartingWithF = months.find(month => { 
  5.   returnmonth.startsWith('F'); 
  6. }); 

TypeScript中使用lambda表达式

 

  1. using System.Collections.Generic; 
  2. using System.Linq; 
  3.  
  4.  
  5. var months = new List<string> {"January","February""March""April"}; 
  6. var shortMonthNames = months.Where(month => month.Length <6); 
  7. var monthAbbreviations = months.Select(month =>month.Substring(0, 3)); 
  8. var monthStartingWithF = months.Find(month => { 
  9.   returnmonth.StartsWith("F"); 
  10. }); 

C#中使用lambda表达式

上述示例演示了C#的System.Linq命名空间中的一些方法,相当于JavaScript的函数式数组方法。下面是JavaScript的数组方法与等价的C# Linq方法:

性能:C#很快。C#的ASP.NET Web框架一直在Techempower的评测中名列前茅,而C#的.NET CoreCLR运行时的性能每个主要版本都在提高。C#拥有优良性能的原因之一是,通过使用结构而不是类,应用程序可以最小化甚至完全消除垃圾回收。因此,C#在视频游戏编程中非常流行。

游戏和混合现实:C#是游戏开发最流行的语言之一,像Unity、Godot甚至Unreal游戏引擎都使用了C#。C#在混合现实中也很流行,因为VR和AR应用程序都是用Unity编写的。

由于C#拥有第一方库、工具和文档,因此一些任务非常容易实现,比如,在C#中创建gRPC客户端要比TypeScript方便得多。相反,在Node.js中使用TypeScript时,就必须找出正确的模块和工具的组合,才能正确地生成JavaScript gRPC客户端,以及相应的TypeScript类型。

高级功能:C#有许多其他语言没有的功能,如运算符重载、析构函数等。

如前所述,世上没有完美的语言。在设计语言时总要有所权衡,所以一些语言的速度更快,但使用难度会增加(例如Rust的借出检查)。另一方面,一些语言非常易用,但通常性能的优化难度就会增加(例如JavaScript的动态语言特性)。正因如此,我相信掌握一组相似的语言会非常有用:这些语言分别有各自的长处,但都很相似,而且能互相配合。例如,下面是我选择的一组语言:

TypeScript

  • 最高层的语言,开发速度最快
  • 性能并非最佳,但适用于大多数应用
  • 不太适合与原生代码结合

C#

  • 仍然是高级语言,支持垃圾回收,所以很容易使用,尽管并不如TypeScript那么容易。
  • 从速度和内存占用量来看,其性能都优于 TypeScript
  • 最重要的是,能够与底层很好地结合

C++

  • 开发难度较大(例如需要手动内存管理),因此开发速度会慢很多
  • 但运行时的性能最佳!而且随处可用,能与许多已有的软件相结合
  • 很像C#,而且标准库很好,但也有许多陷阱(大多数与内存管理有关)。我更希望使用Rust,因为它的内存安全性更好,但我的许多工作都要与已有的C++代码结合,因此使用C++会更容易。

 

责任编辑:未丽燕 来源: 今日头条
相关推荐

2020-09-03 07:17:28

Rus微软C++

2015-05-25 15:11:53

C#最佳书籍

2009-09-01 17:51:47

C#拆箱C#装箱

2020-06-03 16:50:24

TypeScriptReact前端

2023-07-24 13:29:09

TypeChatAI开源

2009-08-25 17:15:50

C#隐藏C#重写C#重载

2020-05-28 15:41:48

微软C+语言

2009-08-31 14:45:13

C#注册表

2009-08-19 16:40:35

C#回调

2009-08-28 12:19:19

C#静态方法

2009-08-04 13:31:35

C#自定义事件

2011-05-23 13:54:04

闭包

2023-03-16 08:01:56

TypeScript开源编程语言

2009-09-02 10:58:02

C#动态数组

2021-03-15 08:18:23

C#反射模块

2009-09-02 17:10:45

C#语言入门

2012-12-07 09:41:39

2015-03-20 10:00:34

LinuxCC++

2009-08-25 17:21:31

C#索引

2009-09-01 18:29:10

C#继承C#多态
点赞
收藏

51CTO技术栈公众号