C# を使用するチームに参加している場合、またはサーバー側またはフル スタックの開発用に調査する場合、この記事は生産性を迅速に向上するのに役立ちます。 ここでは、JavaScript と TypeScript の使い慣れた機能と C# の新機能について説明します。
C#、TypeScript、JavaScript はすべて、C 言語ファミリのメンバーです。 言語間の類似点は、C# ですばやく生産性を高めるのに役立ちます。
-
同様の構文: JavaScript、TypeScript、C# は C 言語ファミリにあります。 その類似性は、C# を既に読んで理解できることを意味します。 いくつかの違いがありますが、ほとんどの構文は JavaScript と C と同じです。中かっことセミコロンは使い慣れています。
if、else、switchなどの制御ステートメントは同じです。for、while、およびdo...whileのループ ステートメントは同じです。classとinterfaceのキーワードは、C# と TypeScript の両方に含まれています。publicからprivateまでの TypeScript と C# のアクセス修飾子は同じです。 -
=>トークン: すべての言語で軽量の関数定義がサポートされます。 C# では、ラムダ 式と呼ばれます。 JavaScript では、通常は 矢印関数と呼ばれます。 - 関数階層: 3 つの言語はすべて 、他の関数で定義されている関数であるローカル関数をサポートします。
-
非同期/待機: 3 つの言語はすべて、非同期プログラミングの同じ
asyncとawaitキーワードを共有します。 - ガベージ コレクション: 3 つの言語はすべて、自動メモリ管理のためにガベージ コレクターに依存します。
-
イベント モデル: C# の
event構文は、ドキュメント オブジェクト モデル (DOM) イベントの JavaScript のモデルに似ています。 - パッケージ マネージャー: NuGet は、JavaScript アプリケーションの npm に似た C# の最も一般的なパッケージ マネージャーです。 C# ライブラリは アセンブリで提供されます。
構文の概要
次の例は、いくつかの一般的なパターンを並べて示しています。 これらの比較は完全ではありませんが、構文の違いをすばやく確認できます。
型注釈:
// TypeScript
let name: string = "Hello";
let count: number = 5;
// C#
string name = "Hello";
int count = 5;
Async/await:
// TypeScript
async function fetchData(): Promise<string> {
const response = await fetch(url);
return await response.text();
}
// C#
async Task<string> FetchDataAsync() {
var response = await client.GetAsync(url);
return await response.Content.ReadAsStringAsync();
}
詳細情報: 非同期プログラミング
クラス:
// TypeScript
class Point {
constructor(public x: number, public y: number) {}
}
// C#
record Point(int X, int Y);
詳細情報: レコード
パターン マッチング:
// TypeScript - manual type checking
if (typeof value === "string") { /* ... */ }
// C# - pattern matching
if (value is string s) { /* use s */ }
詳細情報: パターン マッチング
あなたにとって新しいC#の機能
C# を学習すると、JavaScript の一部ではない概念が見つかります。 TypeScript を使用する場合、これらの概念の一部は慣れている場合があります。
-
C# 型システム: C# は厳密に型指定された言語です。 すべての変数には型があり、その型は変更できません。
class型またはstruct型を定義します。 他の型によって実装される動作を定義するinterface定義を定義できます。 TypeScript にはこれらの概念の多くが含まれていますが、TypeScript は JavaScript 上に構築されているため、型システムはそれほど厳密ではありません。 - "パターン マッチング": パターン マッチングにより、複雑なデータ構造の形状に基づいた簡潔な条件付きステートメントと式が可能になります。
is式は、変数が何らかのパターンで "is" かどうかをチェックします。 パターンベースのswitch式は、変数を検査し、その特性に基づいて決定を行うための豊富な構文を提供します。 - "文字列補間" と "生文字列リテラル": 文字列補間を使用すると、位置識別子を使用するのではなく、評価された式を文字列に挿入できます。 生文字列リテラルは、テキスト内のエスケープ シーケンスを最小限に抑える方法を提供します。
-
Null 許容型と null 非許容型: C# では、 サフィックスを型に追加することで、null 許容値
?型がサポートされます。 null 許容型の場合、式の参照値を取得する前にnullのチェックを行わないと、コンパイラによる警告を受けます。 null 非許容型の場合、その変数にnull値を割り当てる可能性がある場合、コンパイラから警告が表示されます。 これらの機能により、アプリケーションが System.NullReferenceException をスローすることを最小限に抑えることができます。 この構文は、TypeScript が省略可能なプロパティに?を使用していることからよく知られている場合があります。 - LINQ: 統合言語クエリ (LINQ) には、ストレージに関係なく、データのクエリと変換を行う一般的な構文が用意されています。
ヒント
C# の型システム ( class と struct、ジェネリック、インターフェイスなど) の詳細については、「基本」セクションの 「型システム の概要」を参照してください。
さらに学習すると、他の違いが明らかになりますが、それらの違いの多くはスコープ内で小さくなります。
JavaScript と TypeScript の一部の使い慣れた機能とイディオムは、C# では使用できません。
-
動的型: C# では静的な型指定が使用されます。 変数宣言には型が含まれており、その型は変更できません。 C# には、ランタイム バインドを提供する
dynamic型があります。 -
プロトタイプの継承: C# 継承は型宣言の一部です。 C#
class宣言では、基底クラスが示されます。 JavaScript では、__proto__プロパティを設定して、任意のインスタンスの基本型を設定します。 - 解釈された言語: C# コードを実行する前にコンパイルする必要があります。 JavaScript コードは、ブラウザーで直接実行できます。
さらに、C# では、さらにいくつかの TypeScript 機能を使用できません。
- 共用体の型: C# は共用体の型をサポートしていません。 ただし、設計提案は進行中です。
-
デコレーター: C# にはデコレーターがありません。
@sealedなどの一般的なデコレーターの中には、C# の予約キーワードがあります。 他の一般的なデコレーターには、対応する 属性がある場合があります。 他のデコレーターの場合は、独自の属性を作成できます。 - より緩慢な構文: C# コンパイラは、JavaScript が必要とするよりも厳密にコードを解析します。
Web アプリケーションをビルドする場合は、 Blazor を使用してアプリケーションをビルドすることを検討してください。 Blazor は、C# 用に構築されたフル スタック Web フレームワークです。 Blazor コンポーネントは、サーバー、.NET アセンブリ、または WebAssembly を使用してクライアント上で実行できます。 Blazor では、お気に入りの JavaScript または TypeScript ライブラリとの相互運用がサポートされています。
次のステップ
- C# のツアー: すべての C# 機能の概要について説明します。
- 初心者向けチュートリアル: 対話型のレッスンを使用して、C# を段階的に学習します。
- C# で構築できる内容: C# で作成できるアプリケーションの種類を調べる。
- C# の基礎: 型システム、オブジェクト指向プログラミングなどについて詳しく説明します。
.NET