typescript 枚举继承-C# 是 TypeScript 的最佳替代品吗?

作者|内特希尔译者|新月

出品| CSDN(ID:CSDNnews)

TypeScript 非常出色。 它是强类型和快速开发的完美结合,这使得它非常易于使用,以至于我在很多情况下都默认使用这个库。 而且,世界上没有完美的语言,TypeScript在某些情况下并不是最合适的工具:

在这种情况下,TypeScript 开发人员最好选择另一种语言。 C#、Go 和 Java 都是特别好的选择。 它们比 TypeScript 快得多,并且每种语言都有自己的优势。 C# 与 TypeScript 配合得很好,让我解释一下原因。

图片来源:CSDN东方IC付费下载

TypeScript 是添加了 C# 的 JavaScript

C# 与 TypeScript 配合得很好,因为它们看起来像同一种语言。 这三个脚本都是由 Anders Hejlsberg 设计的,但在很多方面,TypeScript 是添加了 C# 的 JavaScript。 它们的功能和句型相似,因此很容易将它们组合到同一个项目中。 更重要的是,C# 的语言与 TypeScript 非常相似,因此开发人员非常容易阅读和编写代码。

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

C# 和 TypeScript 之间的相似之处

其实你已经知道C#和TypeScript有很多相似之处,比如基于C的句型、类、接口、泛型等等。下面,我来详细列出两者的相似之处:

异步/等待

首先,C# 和 JavaScript 都使用 async/await 来处理异步代码。 在 JavaScript 中,异步操作由 Promises 表示,应用程序可以等待异步操作的完成。 C#中的Promise虽然是一个Task,但是概念和Promise是一模一样的,也有对应的方法。 以下示例演示了两种语言中 async/await 的用法:

async function fetchAndWriteToFile(url: string, filePath:string): Promise {  // fetch() returns aPromise  const response = awaitfetch(url);  const text = awaitresponse.text();  // By the way, we'reusing Deno (https://deno.land)  awaitDeno.writeTextFile(filePath, text);  return text;}

TypeScript 中的 async/await 示例

using System.IO;using System.Net.Http;using System.Threading.Tasks;
async Task FetchAndWriteToFile(string url, stringfilePath) { // HttpClient.GetAsync()returns a Task var response = await newHttpClient().GetAsync(url); var text = awaitresponse.Content.ReadAsStringAsync(); awaitFile.WriteAllTextAsync(filePath, text); return text;}

C# 中 async/await 的示例

下面是 JavaScript 的 PromiseAPI 和等效的 C# TaskAPI:

JavaScriptAPI

等效的 C# API

Promise.all()

任务.WaitAll()

Promise.resolve()

任务.FromResult()

Promise.reject()

任务.FromException()

Promise.prototype.then()

任务.ContinueWith()

新的承诺()

newTaskCompletionSource()

Lambda 表达式和函数链表

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

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

在 TypeScript 中使用 lambda 表达式

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

在 C# 中使用 lambda 表达式

上面的例子演示了C#的System.Linq命名空间中的一些技术,相当于JavaScript的函数式链表方法。 下面是 JavaScript 链表方法和等效的 C# Linq 方法:

JavaScriptAPI

等效的 C# API

Array.prototype.filter()

可枚举.Where()

Array.prototype.map()

枚举.Select()

Array.prototype.reduce()

可枚举的.Aggregate()

Array.prototype.every()

枚举.All()

Array.prototype.find()

列表.Find()

Array.prototype.findIndex()

列表.FindIndex()

处理空运算符

C# 和 TypeScript 在处理 null 时也具有相同的特征:

功能名称语法文档链接

可选属性

财产?

TS:#可选属性

C#:

非空断言

对象!.属性

TS:#非空断言运算符

C#:

可选链接

对象?.属性

JS:

C#:#null-条件运算符--and-

空合并

对象??替代值

JS:

C#:

解释

虽然C#默认不支持链表或类的重构,但它确实支持Tuple和Record的重构,并且用户还可以定义自定义类型的重构。 以下是 TypeScript 和 C# 中的重构示例:

const author = { firstName: 'Kurt', lastName: 'Vonnegut' };// Destructuring an object:const { firstName, lastName } = author;
const cityAndCountry = ['Indianapolis', 'United States'];// Destructuring an array:const [city, country] = cityAndCountry;

TypeScript 中的重构示例

using System;
var author = new Author("Kurt", "Vonnegut");// Deconstructing a record:var (firstName, lastName) = author;
var cityAndCountry = Tuple.Create("Indianapolis","United States");// Deconstructing a tuple:var (city, country) = cityAndCountry;
// Define the Author record used aboverecord Author(string FirstName, string LastName);

C# 所示的示例

命令行界面 (CLI)

我的开发方法是使用文本编辑器编译代码,然后在终端中运行命令来构建并运行。 对于 TypeScripttypescript 枚举继承,这意味着使用 Node 或 deno 命令行界面 (CLI)。 C# 也有一个类似的 CLI,称为 dotnet(以 C# 的 .NET 运行时命名)。 以下是使用 dotnetCLI 的一些示例:

mkdir app && cd app# Create a new console application# List of available app templates:https://docs.microsoft.com/dotnet/core/tools/dotnet-newdotnet new console# Run the appdotnet run# Run tests (don't feel bad if you haven't written those)dotnet test# Build the app as a self-contained# single file application for Linux.dotnet publish -c Release -r linux-x64

基本功能(类、泛型、错误和枚举)

这是 TypeScript 和 C# 之间更基本的相似之处。 下面通过例子对这几个方面进行介绍:

import { v4 as uuidv4 } from'https://deno.land/std/uuid/mod.ts';
enum AccountType { Trial, Basic, Pro}
interface Account { id: string; type: AccountType; name: string;}
interface Database { insert(item: T):Promise; get(id: string):Promise;}
class AccountManager {
constructor(database:Database) { this._database =database; }
asynccreateAccount(type: AccountType, name: string) { try { const account = { id: uuidv4(), type, name; }; awaitthis._database.insert(account); } catch (error) { console.error(`Anunexpected error occurred while creating an account. Name: ${name}, Error:${error}`); } }
private _database:Database;}

TypeScript 类的示例

using System;using System.Threading.Tasks;
enum AccountType { Trial, Basic, Pro}
record Account(string Id, AccountType Type, string Name);
interface IDatabase { Task Insert(T item); Task Get(stringid);}
class AccountManager {
publicAccountManager(IDatabase database) { _database = database; }
public async voidCreateAccount(AccountType type, string name) { try { var account = newAccount( Guid.NewGuid().ToString(), type, name ); await_database.Insert(account) } catch (Exceptionexception) { Console.WriteLine($"An unexpected error occurred while creating anaccount. Name: {name}, Exception: {exception}"); } }
IDatabase_database;}

C# 类的示例

C# 的其他优点

与 TypeScript 的相似性并不是 C# 的唯一优点,它还有其他优点:

原生代码结合

C# 的最大优势之一是它可以深入本机代码。 正如本文开头提到的,TypeScript 并不擅长与 C/C++ 代码结合。 Node.js 有一个支持原生 C/C++ 的插件,称为 Node-API,它需要为原生函数编译额外的 C++ 包装器,将原生类型转换为 JavaScript 对象,反之亦然,类似于 JNI 的工作方式。 C#可以直接调用原生函数,只需要把库放在应用程序的bin目录下,然后在C#中将API定义为外部函数即可。 之后,外部函数就可以像C#函数一样使用,并且.NET运行时将处理C#数据类型和本机数据类型之间的转换。 例如,如果本机库导入以下 C 函数:

int countOccurrencesOfCharacter(char *string, char character) {    int count = 0;    for (int i = 0;string[i] != ''; i++) {        if (string[i] ==character) {            count++;        }    }    return count;}

可以像这样从 C# 调用:

using System;using System.Runtime.InteropServices;
var count = MyLib.countOccurrencesOfCharacter("C# is prettyneat, eh?", 'e');// Prints "3"Console.WriteLine(count);
class MyLib { // Just placeMyLibraryName.so in the app's bin folder [DllImport("MyLibraryName")] public static externint countOccurrencesOfCharacter(string str, char character);}

这些方法可以通过C链接访问任何动态库(.so、.dll或.dylib),也就是说,你可以轻松调用用C、C++、Rust、Go或其他语言编写的代码,只要编译过转化为机器码。 能。 本机交互的其他应用包括:

风暴

C# 的一个独特功能是它提供一流的风暴支持。 在 TypeScript 中,可以实现 addEventListener() 方法让客户端窃听风暴,而 C# 有 event 关键字,可以用来定义风暴,通过简单的句子(无需需要 TypeScript 自动迭代所有风暴窃听者并在 try/catch 块中执行它们)。 例如,我们可以让 Connection 类定义一个 MessageReceived 事件,如下所示:

class Connection {    // AnAction is a callback that accepts a string parameter.    public eventAction MessageReceived;}

使用Connection代码,可以通过+=操作符为MessageReceived添加处理函数,如下:

var connection = new Connection();connection.MessageReceived += (message) => {   Console.WriteLine("Message was received: " + message);};

Connection类可以在内部调用MessageReceived来为所有窃听者触发MessageReceived风暴:

// Raise the MessageReceived eventMessageReceived?.Invoke(message);

其他优点

总结

正如前面提到的,没有完美的语言。 设计语言时总是要进行权衡,因此有些语言速度更快,但使用起来不太困难(比如 Rust 的贷款检测)。 另一方面,有些语言非常好用,但优化一般性能的难度会降低(比如JavaScript的动态语言特性)。 正因为如此,我相信拥有一组相似的语言特别有用:每种语言都有自己的优点,但都很相似,但可以一起工作。 例如,下面是我选择的一组语言:

打字稿

C#

C++

参考链接:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 typescript typescript 枚举继承-C# 是 TypeScript 的最佳替代品吗? https://www.wkzy.net/game/192434.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务