ヒント
ソフトウェアの開発は初めてですか? 最初に、 作業の開始 に関するチュートリアルから始めます。 最初のプログラムを記述するときに型が導入されます。
別の言語で経験がありますか? C# の組み込み型は、Java、C++、およびその他の言語の型に密接にマップされます。 C# 固有の詳細については、 リテラル構文 と 型推論 セクションをスキミングします。
C# には、追加の参照なしで任意のプログラムで使用できる組み込み型のセットが用意されています。 これらの型は、操作する最も一般的なデータ (数値、true/false 値、個々の文字、テキスト) を対象とします。 C# キーワードを .NET 型にマッピングする完全な参照テーブルについては、 組み込み型 (C# リファレンス) を参照してください。
数値型
C# には、整数、浮動小数点数、および 10 進数の組み込み型があります。 最も一般的に使用される型は、 int、 double、および decimalです。
int population = 67_000_000;
long distance = 384_400_000L;
short temperature = -40;
byte red = 255;
double pi = 3.141592653589793;
float gravity = 9.81f;
decimal price = 19.99m;
各数値型には、固定サイズと範囲があります。
int には 32 ビット整数 (約 21 億±) が格納され、 long は 64 ビット整数を格納し、 short と byte は小さい値を格納します。 サイズと範囲の完全な一覧については、「 整数の数値型 」と 「浮動小数点数の数値型」を参照してください。
一般的な浮動小数点演算、メモリが制約されている場合のdouble、正確な 10 進精度 (財務計算など) が必要な場合にfloatには、decimalを使用します。
fリテラルにはfloatサフィックスを追加し、decimalリテラルにはmを追加します。 サフィックスがない場合、コンパイラは小数点を持つ数値を doubleとして扱います。
符号なし型
各符号付き整数型には、正の範囲の 2 倍の負以外の値のみを格納する符号なし対応する型があります。
uint fileSize = 4_294_967_295;
ulong totalBytes = 18_446_744_073_709_551_615;
ushort port = 443;
ファイル サイズやネットワーク ポートなど、データに対して負の値が有効でない場合は、符号なし型を使用できます。 実際には、多くのアプリケーションでは、.NET API 全体で符号付き型が既定値であるため、正の値に対しても int または long を使用します。
システム固有サイズの整数
nint型とnuint型は、サイズがプラットフォームのネイティブ ポインター サイズと一致する整数を表します。32 ビット プラットフォームでは 32 ビット、64 ビット プラットフォームでは 64 ビットです。
nint bufferSize = 1024;
nuint elementCount = 256;
日常的なコードで nint や nuint が必要な可能性はほとんどありません。 これらは、プラットフォームのポインター サイズに一致することが重要な相互運用シナリオと低レベルのメモリ操作用に存在します。
int または long を使用し、ネイティブサイズの型を使用する特定の理由がない限りそのまま維持します。 詳細については、次のトピックを参照してください。 nint および nuint
bool、char、string
C# には、数値以外にも、よく使用される 3 つの組み込み型が用意されています。
bool isValid = true;
char grade = 'A';
string greeting = "Hello, world!";
-
bool—trueまたはfalseを格納します。 条件、ループ、論理式で使用します。 -
char— 単一の Unicode 文字 (UTF-16 コード単位) を単一引用符で囲って格納します。 -
string— 二重引用符で囲まれた一連の文字を格納します。 文字列は 不変です。 文字列を作成すると、その内容を変更することはできません。 文字列を変更するように見える操作では、実際には新しい文字列が作成されます。
文字列は、C# で最も使用される型の 1 つです。 補間、未加工の文字列リテラル、検索、分割、比較など、文字列操作の詳細については、「 文字列 」セクションを参照してください。
リテラル構文
リテラルは、コード内で直接記述する値です。 コンパイラは、各リテラルに、その形式と指定したサフィックスに基づいて型を割り当てます。 C# では、次の種類のリテラルがサポートされています。
-
整数リテラル — 10 進数 (
42)、16 進数 (0x2A)、およびバイナリ (0b_0010_1010)。 -
浮動小数点リテラル — 既定では
double(3.14) 、fがついたfloat、およびmを使用したdecimal(3.14m)。 -
文字リテラル — 単一引用符 (
'A') およびエスケープシーケンス ('\n') を含む 1 文字。 -
文字列リテラル — 標準 (
"hello")、逐語的 (@"C:\path")、生の (""" ... """)、補間された ($"value: {x}")。 -
ブールリテラル -
trueとfalse。 -
nullリテラル - 参照型と null 許容値型に値が存在しないことを表します。 -
defaultリテラル — 任意の型の既定値を生成します (default式で説明します)。
次のセクションでは、最も一般的なリテラル形式について詳しく説明します。
整数リテラル
int dec = 42;
int hex = 0x2A;
int bin = 0b_0010_1010;
long big = 1_000_000_000L;
16 進数には 0x プレフィックスを使用し、バイナリには 0b を使用します。
L、long、またはUをuint、ULをulongとして追加します。
_桁区切り記号を数値内の任意の場所に配置して、読みやすくします。 一般的なパターンには、10 進リテラル (1_000_000_000) の桁区切り記号、16 進数 (0xFF_FF) のバイトまたは単語の境界、バイナリ (0b_0010_1010) のニブル境界などがあります。
浮動小数点リテラル
double d = 3.14;
float f = 3.14f;
decimal m = 3.14m;
double scientific = 1.5e6; // 1,500,000
サフィックスがない場合、小数点を持つ数値リテラルは double。
floatにfを追加し、decimalにmを追加します。 科学的表記 (1.5e6) もサポートされています。
文字リテラルと文字列リテラル
char newline = '\n';
char unicode = '\u0041'; // 'A'
string message = $"Found {dec} items"; // interpolated string
string path = @"C:\Users\docs\file.txt"; // verbatim string
string json = """
{ "name": "Alice", "age": 30 }
"""; // raw string literal
string raw = $"""
Found {dec} items in "{greeting}"
"""; // raw + interpolated
文字リテラルは一重引用符を使用し、エスケープ シーケンス (\n、 \t、 \u) をサポートします。 文字列リテラルでは二重引用符が使用されます。
補間の $ を使用して文字列のプレフィックスを付けます。 文字列に引用符、円記号、または埋め込み JSON または XML が含まれている場合は、各文字をエスケープする代わりに、生の文字列リテラル ( """ で区切られます) を使用します。 未加工の文字列リテラルも補間 ($""") と組み合わせます。
古いコードでは、エスケープ処理を回避するために @ (逐語的な文字列) が使用されています。 生の文字列リテラルは読み書きが簡単なので、新しいコードに適しています。
default 表現
default式では、型の既定値が生成されます。数値型の0、falseのbool、および参照型のnull。
int defaultInt = default; // 0
bool defaultBool = default; // false
string? defaultString = default; // null
// Use default in a conditional:
var limit = (args.Length > 0) ? int.Parse(args[0]) : default(int);
default式はジェネリック コードで最も役立ちます。具体的な型がわからないため、0やnullなどの特定の値をハードコーディングすることはできません。 コンパイラがコンテキストから型を推論できる場合は default を書き込むか、型が明確でない場合は default(T) します。 型別の既定値の完全な一覧については、「 C# 型の既定値」を参照してください。
暗黙的に型指定された変数 var
var キーワードは、初期化子からローカル変数の型を推論するようにコンパイラに指示します。
var count = 10; // compiler infers int
var name = "C#"; // compiler infers string
var items = new List<int>(); // compiler infers List<int>
// var requires an initializer — the compiler needs a value to infer the type.
// The following line wouldn't compile:
// var unknown;
変数はまだ厳密に型指定されています。 var では動的になりません。 コンパイラはコンパイル時に型を決定し、通常どおり型セーフを適用します。
varは、視覚的なノイズを減らすために、型が右側から明らかである場合に使用します。 コードがわかりやすくなったら、型を入力します。 詳細については、「 暗黙的に型指定されたローカル変数」を参照してください。
ターゲット型の new 式
変数宣言やメソッド パラメーターなど、コンテキストからターゲット型が既にわかっている場合は、 new 式から型名を省略できます。
List<string> names = new() { "Alice", "Bob", "Charlie" };
Dictionary<string, int> scores = new()
{
["Alice"] = 95,
["Bob"] = 87
};
ターゲット型の new は、型名が長い場合や、割り当ての左側に表示される場合の繰り返しを減らします。 これは、メソッド引数や return ステートメントなど、コンパイラがターゲットの型を決定できる任意の場所で機能します。 詳細については、「 new 演算子 - ターゲット型の new」を参照してください。
dynamic 型
dynamic型は、コンパイル時の型チェックをバイパスします。 コンパイラは、実行時に dynamic 変数に対する操作を解決します。
dynamic value = 42;
Console.WriteLine(value.GetType()); // System.Int32
value = "Now I'm a string";
Console.WriteLine(value.GetType()); // System.String
// The compiler doesn't check operations on dynamic at compile time.
// Errors surface at run time instead.
コンパイル時に型が不明な COM API、動的言語、またはリフレクションが多いシナリオを操作する場合は、 dynamic を使用します。 コンパイル時の安全性が失われるため、ほとんどのアプリケーション コードで dynamic を避けてください。 コンパイラが通常キャッチするエラーは、代わりに実行時例外になります。 詳細については、「 動的な型」を参照してください。
こちらも参照ください
.NET