从C#转到打字稿
#javascript #typescript #csharp

当我们启动一种新语言,一种新技术时,我们总是寻求与我们所知道的联系。当我将自己与类型脚本相提并论,并来自世界。NETC#时,我开始提出这些语言之间的差异和共同点。

打字什么?

打字稿是Microsoft(github source)检测和维护的开源语言,在Apache许可证2下。粗javascript。我将报价编译为编译,因为它不是C#中的汇编,而是JavaScript代码中的代码TypeCript的转换( transpiler )。



javaScript中“编译”典型文件的命令是:

tsc nomDuFichier.ts.

该命令将是同名的文件,但在JS(JavaScript)中。

但是,如果腔体输出javascript输出,为什么类型脚本?

JavaScript是一种动态典型的语言。在某些情况下,这种有助于变量衰减的特征可以导致iNtage resorts。打字稿中的静态类型系统使得可以得出对象的形式,允许类型验证代码的正确功能。线条更加严格,具有强大的打字,突然在代码的代码中可以看到错误,而不是在测试/产品的末尾看到错误。

比较

我将把代码放在C#与Typescript方向上的两种语言中进行比较。要测试代码的提示,您可以与C#dotnet script的Visual Studio代码一起使用(请参阅mon post sur le sujet)和类型脚本:deno.land或直接与Playground在线。

变量

// C#
// Déclarer une variable
var unNombre = 12345;
var unBlabla = "Faire du blabla";
// équivaut à :
int unNombre = 12345;
string unBlabla = "Faire du blabla";

// Utilisation des constantes
const int unAutreNombre = 123456;
unAutreNombre = 123456; // ---> Exception
// TYPESCRIPT
// Déclarer une variable
let unNombre = 12345;
let unBlabla = "Faire du blabla";
// équivaut à :
let unNombre : number = 12345;
let unBlabla : String = "Faire du blabla";

// Utilisation des constantes
const unAutreNombre = 123456;
unAutreNombre = 123456; // ---> Exception

在c#中,我们可以使用clavede1(doc Microsoft)一词来澄清变量。 CAF是在编译时,编译器将为变量选择合适的类型,但我们也可以显式地说,直接表明该类型。我个人会假装,没有歧义。对于types primitifs sur TS

在TS中,咖啡馆是欺骗变量的clavede2一词,不需要初始化nâ。还有var,它要关注“函数”,而let则携带在块上。


对于两种语言,const表示汽车是常数。

状况

如果别的

// C#
int x = 10;
int y = 20;

if (x > y) 
{
    Console.WriteLine("x est plus grand que y.");
} 
else
{
    Console.WriteLine("x est inférieur ou égal à y.");
}
// TYPESCRIPT
let x: number = 10;
let y: number = 20;

if (x > y) 
{
    console.log('x est plus grand que y.');
} 
else
{
    console.log('x est inférieur ou égal à y.');
}

转变

// C#
short day = 4;

switch (day) {
    case 1:
        console.log("C'est lundi");
        break;
    case 2:
        console.log("C'est mardi");
        break;
    case 3:
        console.log("C'est mercredi");
        break;
    case 4:
        console.log("C'est jeudi");
        break;
    case 5:
        console.log("C'est vendredi");
        break;
    case 6:
        console.log("C'est samedi");
        break;
    case 7:
        console.log("C'est dimanche");
    default:
        console.log("Euhh... y a une coui(biiiip) dans le pâté");
        break;
}
// TYPESCRIPT
let day : number = 4;

switch (day) {
    case 1:
        console.log("C'est lundi");
        break;
    case 2:
        console.log("C'est mardi");
        break;
    case 3:
        console.log("C'est mercredi");
        break;
    case 4:
        console.log("C'est jeudi");
        break;
    case 5:
        console.log("C'est vendredi");
        break;
    case 6:
        console.log("C'est samedi");
        break;
    case 7:
        console.log("C'est dimanche");
    default:
        console.log("Euhh... y a une coui(biiiip) dans le pâté");
        break;
}

带扣

为了

// C#
for (var i = 0; i < 3; i++) 
{
  Console.WriteLine("Numéro de i = " + i);
}
// TYPESCRIPT
for (let i = 0; i < 3; i++) 
{
  console.log ("Numéro de i = " + i);
}

foreach

// C#
int[] collection = {10,20,30,40};

foreach(var item in collection) {
  Console.WriteLine(item);
}
// TYPESCRIPT
let collection = [10, 20, 30, 40];

for (var item of collection) {
  console.log(item);
}

尽管

// C#
int i = 1;

while (i < 4) {
    Console.WriteLine( "J'en suis à :" + i );
    i++;
}
// TYPESCRIPT
let i: number = 1;

while (i < 4) {
    console.log( "J'en suis à :" + i )
    i++;
}

MES/功能

// C#
// Fonction sans paramètre ni retour.
public void Display()
{
   Console.WritleLine("Hello de C# !");
}
// TYPESCRIPT
// Fonction sans paramètre ni retour.
function display() 
{
    console.log("Hello de TypeScript!");
}

// pareil que
function display() : void 
{
    console.log("Hello de TypeScript!");
}

类型返回到TS中的TS,将自己放在参数之后。

function NomDeLaFonction (nomParameter: type,...) : typeRetour { ... }

如果没有回报,则不需要添加返回类型,但是我们可以说!返回void存在。我喜欢穿上它,CAF明确!

// C#
public string Greet(string greeting, string name) 
{
    return greeting + " " + name + "!";
}

// Avec paramètre optionnel.
public string Greet(string greeting, string name = null)
{
    return greeting + " " + name + "!";
}

// Avec un paramètre par défaut
public string Greet(string name, string greeting = "Hello")
{
    return greeting + " " + name + "!";
}
// TYPESCRIPT
function Greet(greeting: string, name: string ) : string 
{
    return greeting + ' ' + name + '!';
}

// Avec paramètre optionnel.
function Greet(greeting: string, name?: string ) : string 
{
    return greeting + ' ' + name + '!';
}

// Avec un paramètre par défaut
function Greet(name: string, greeting: string = "Hello") : string 
{
    return greeting + ' ' + name + '!';
}

在TS中,必要的可选参数和参数之间存在差异。对于可选参数name?: string,如果在呼吁该功能期间未指示参数nâ,则类型为undefined

班级

typeScript(doc sur Typescript.org)中的class上的DOC。我将尝试将最多的代码结束。

// C#
public class Person
{
    protected readonly string name;
    // Pour montrer les niveaux de visibilité
    public int age;
    string numSecu; // --> défaut en private

    public Person(string nom, int age, string secu)
    {
        name = nom;
        age = age;
        numSecu = secu;
    }
}

public class Habitant : Person
{
    public string Adresse { get; set; }

    // Juste pour montrer en "Full"
    private string _autreAdresse;

    public string AutreAdresse
    {
        get { return _autreAdresse; }
        set { _autreAdresse = value; }
    }

    public Habitant(string nom, int age, string secu, string adress)
        : base(nom, age, secu) // Appel au constructeur de Person
    {
        Adresse = adress;
    }

    public void WhoAreYou()
    {
        Console.WriteLine($"Je suis " + this.name + " et j'habite au " + this.Adresse);
    }
}
// TYPESCRIPT
class Person 
{
    // Fields
    protected readonly name: string;
    // Pour montrer les niveaux de visibilité
    age: number; // --> défaut en public
    private numSecu: string;

    constructor(nom: string, age: number, secu: string) 
    {
      this.name = nom;
      this.age = age;
      this.numSecu = secu;
    }
}

class Habitant extends Person 
{

    // Field
    _adresse: string;

    // Getter et Setter
    get adresse() {
        return this._adresse;
    }
    set adresse(value) {
        this._adresse = value;
    }

    // Constructeur
    constructor(nom: string, age: number, secu: string, adress: string) 
    {
        // super : pour faire appel au constructeur de Person.
        super(nom, age, secu);
        this._adresse = adress;
    }

    public whoAreYou () : void 
    {
        console.log("Je suis " + this.name + " et j'habite au " + this.adresse)
    }
}

// Utilisation de la class
let hab : Habitant = new Habitant("Jean", 25, "15151548", "la bas");
hab.whoAreYou();

在c#或ts中,存在一些差异,但仍然很接近。

界面

好的汽车是我在C#和TS之间发现的很大差异。

接口为类型

// TYPESCRIPT
interface Person {
    name: string;
    age: number;
}

let quiEstce: Person = { name:"Jean", age:25 };

CAF是C#中的一个简单的POCO对象。只有没有thode的专有人来添加“行为”。

与C相比,“经典”接口

// C#
interface Person 
{
    name: string;
    age: number;

    // Déclare une fonction
    getAnneeNaissance(anneeEnCours: Date) : number;
}

我们可以用专有性和螨虫阐明界面,这将与一类有关。

接口作为函数类型

Lâtypript接口也用于完成一种类型的函数。这保证了功能的签名。

// TYPESCRIPT
// Interface comme type de fonction
interface Person 
{
    name: string;
    age: number;
}

createPerson(name: string, age: number) : void 
{
    // code de création
    Person     
}

let unePersonne: Person = createPerson;

在TS中:接口为对象提供了结构。他们可以犹豫其他界面和班级。

在C#中:接口是含义类别的合同。他们只能容纳其他界面。

还有所有这一切?

c#腔​​的伟大力量之一是LINQ,那是什么相同的东西?


好吧!

Its time to party

在哪里

// C#
Person jean = new Person() { Name="Jean", Age=42, Sexe="homme"};
Person gisel = new Person() { Name="Giselle",Age=52,Sexe="femme"};
Person marcel = new Person() { Name="Marcel", Age=25,Sexe="homme"};
Person marion = new Person() { Name="Marion", Age=28, Sexe="femme"};
Person[] allPeople = new Person[] { jean,gisel, marcel, marion };

var selectedPerson = allPeople.Where(x => x.Sexe == "homme");

foreach (var person in selectedPerson)
{
    Console.WriteLine(person.Name);
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Sexe { get; set; }
}
// TYPESCRIPT
interface Person{
    name: string;
    age: number;
    sexe: string;
}

let allPeople : Person[] = [{name:"Jean", age: 42, sexe:"homme"},
                            {name:"Marcel", age: 25, sexe:"homme"},
                            {name:"Giselle", age:52, sexe:"femme"},
                            {name:"Marion", age:28, sexe:"femme"}]

// utiliser "filter"
let selectedPerson = allPeople.filter(x => x.sexe === 'homme');

for(let person of selectedPerson)
{
    console.log(person.name);
}

任何

// C#
bool found = allPeople.Any(x => x.age == 25);
// TYPESCRIPT
boolean found = (allPeople.findIndex(x => x.age === 25) >= 0);

firstordEfault

// C#
var person = allPeople.FirstOrDefault(x => x.Name == "Jean");
// TYPESCRIPT
let person = allPeople.find(x => x.name === "Jean");

得出结论

我没有把所有内容都放在所有语言中,而且汽车实际上是在日常使用中,而且从长远来看,我们掌握了一种语言,但是我们可以看到两种语言非常接近。