C#8.0 Essentials 第 2 章 – データ型
2.1 基本的なデータ型
C# の基本データ型には、それらに関連付けられたキーワードがあります。Decimalは、表現エラーなしで大きな数値を格納できる特殊な浮動小数点数型です。
2.1.1 整数型
C# には 8 つの整数型があります
タイプ | サイズ | BCL名 | サフィックス |
---|---|---|---|
エスバイト | 8ビット | System.SByte | |
バイト | 8ビット | システム.バイト | |
短い | 16ビット | System.Int16 | |
ウーショート | 16ビット | System.UInt16 | |
整数 | 32ビット | System.Int32 | |
単位 | 32ビット | System.UInt32 | U或u |
長さ | 64ビット | System.Int64 | LかL |
頭 | 64ビット | System.UInt64 | UL |
C#のすべてのプリミティブ型には短縮名と完全名があります。完全名は **BCL (基本クラス ライブラリ)** の型名に対応しており、これはすべての言語で同じであり、アセンブリ内の型を一意に識別します。ロゴ。コンパイラの観点から見ると、最終的に生成された CIL コードでは、ソース コードでどれが使用されているかがわかりません。System.String の代わりに string を使用するなど、短縮名と完全名を交互に使用しないでください。
2.1.2 浮動小数点型
浮動小数点数の精度は可変です。分母が 2 の整数乗でない限り、数値は 2 進浮動小数点型では正確に表現できません。たとえば、0.1 は 0.09999999... または 0.10000 として簡単に表現できます。 ..1。
タイプ | サイズ | BCL名 | 有効数字 | サフィックス |
---|---|---|---|---|
浮く | 32ビット | System.Single | 7 | ふかふ |
ダブル | 64ビット | System.Double | 15-16 | Dまたはd |
2.1.310進数型
タイプ | サイズ | BCL名 | 有効数字 | サフィックス |
---|---|---|---|---|
10進数 | 128ビット | System.Decimal | 28-29 | メートルかメートル |
浮動小数点数とは異なり、10 進数型では範囲内のすべての 10 進数が正確であることが保証されますが、範囲が狭く、計算速度が若干遅くなりますが、差は小さいため無視できます。小数を表すために m が使用される理由は、このデータ型が金銭計算でよく使用されるためです。
2.1.4 リテラル値
リテラル値は、ソース コード内の固定値を表します。値をソース コードに直接入れることをハードコーディングと呼びます。デフォルトでは、小数点を含むリテラル値を入力すると、コンパイラは自動的にそれを double 型として解釈します。整数値は通常、デフォルトで 32 ビット int に設定されます。値が大きすぎる場合、コンパイラはそれを解釈します。長いものとして。さらに、C# コンパイラでは、次のような非 int 数値クラスへの代入が可能です。
short s = 42;
byte b = 77;
これはリテラル値の場合にのみ当てはまります。次の場合は不正です。
b = s;
数値が非常に大きい場合があります。読みやすさの問題を解決するために、C#7.0 では、9_814_072_356 などのリテラル値を記述するときにアンダースコア (_) で区切ることができる数値区切り記号のサポートが追加されました。
C#7.0 以降、数値は 2 進値として表現できます。たとえば、0b101010 は 42 を表します。C#7.2 以降、数値区切り文字を x または b の後に配置できます。
数値は出力時に 16 進数でフォーマットできます。
//输出0x2A,即十六进制的42
System.Console.Writeline($"0x{42:X}");
double 値の文字列形式をより正確に表すには、変換に書式文字列とラウンドトリップ書式指定子 R (または r) を使用できます。
2.2 より基本的なタイプ
2.2.1 ブール型
タイプ | サイズ | BCL名 |
---|---|---|
ブール | 8ビット | System.Boolean |
Boolean 型の値を保持するには 1 バイナリ ビットで十分ですが、C# では bool のサイズは実際には 1 バイトです。
2.2.2文字の種類
タイプ | サイズ | BCL名 |
---|---|---|
文字 | 16ビット | System.Char |
char は16 ビット文字を表します。サイズは ushort と同じですが、char は C# 固有の型であるため、別個に扱う必要があります (C++ では 8 ビット)。
バックスラッシュと特殊文字コードは、総称してエスケープ シーケンスと呼ばれます。
2.2.3 文字列
タイプ | BCL名 |
---|---|
弦 | System.String |
0 個以上の文字の有限シーケンスを文字列と呼びます。
C# では、文字列の前に @ 記号を使用して、エスケープ シーケンスが処理されず、結果が逐語的な文字列リテラルであることを示すことができます。(C++11 の生の文字列に相当します)。
C++ とは異なり、C# は文字列リテラルを自動的に連結しません。(はい、C++ の「ab」と「cd」は自動的に「abcd」に連結されます)。
同じ文字列リテラルがアセンブリ内で複数回出現する場合、コンパイラはアセンブリ内でその文字列を 1 回だけ定義し、すべての変数はその文字列を指します。
最初に $ を指定し、次に @ を指定することで、逐語的と補間を組み合わせることができます。
文字列補間は、次のような string.Format() メソッドを呼び出すための糖衣構文です。
//表面上
System.Console.Writeline($"your name is {firstname},{lastname}.");
//实际上
object[] args = new object[] {firstname,lastname};
System.Writeline($"your name is {0},{1}.",args);
ある程度のローカリゼーション サポートが実装されており、文字列によってコンパイル後のコード インジェクションが発生することはありません。
一部の文字列メソッド: Format、Concat、Compare、StartsWith、EndsWith、ToLower、ToUpper、Trim、TrimEnd、Replace。
以前は、静的メソッドを呼び出すには名前空間と型名の接頭辞が必要でしたが、C# 6.0 の新しいusing static ディレクティブを使用して、これらの接頭辞を回避できます。静的メソッドとプロパティのみがサポートされます。
補間または書式設定された文字列に実際の左中括弧と右中括弧を追加したい場合は、文字列 "{ 123 }" の場合は $"{ { {123} }}" のように、2 つの中括弧を続けて記述できます 。
出力改行に必要な文字はオペレーティング システムによって決まります。Windowsの改行文字は\r と \n の組み合わせですが、UNIX では単一の \n です。
クロスプラットフォームの互換性を確保するには、\n代わりに System.WriteLine() と System.Enviroment.NewLine() を使用してください。
C# 構文を使用すると、メンバー変数 ( C# ではフィールドと呼ばれます)のようなプロパティ (Properties ) にアクセスできます。プロパティは、**割り当てメソッド (セッター)および値メソッド (ゲッター)**と呼ばれる特別なメソッドを定義します。
文字列型の主な特徴は、それが不変であることです。パフォーマンス上の理由から、既存の文字列の内容を変更するメカニズムは提供されません。同じメモリ位置で文字列内のすべての文字を大文字に変換することは不可能です。他の場所でのみ使用できます。古い文字列の大文字バージョンになるように、その位置に新しい文字列を作成しますが、古い文字列は変更されません。
変更する必要がある文字列が多数ある場合は、文字列の代わりに System.Text.StringBuilder 型を使用することを検討してください。
2.2.4null と void
参照型変数に null を割り当てることは、値をまったく割り当てないこととは異なります。文字列変数に null を割り当てることは、変数に "" を割り当てることと同じ概念ではありません。
変数を宣言するときは、名前の後に疑問符を追加して、変数を null に設定できることを示します。これは、null許容修飾子です(C# 2.0 以降)。
C#8.0 より前では、制御可能な修飾子は参照型変数の宣言に使用できません。C#8.0 以降、null 許容参照型の概念があります。これを有効にするには、変数を宣言する前に「#nullable を任意の場所に配置する必要があります」 .enable」ステートメント。有効にすると、制御可能な修飾子のない変数を null に設定すると、警告メッセージが生成されます。
void には、値を返さないメソッドをマークすることと、不明な型の格納場所へのポインターを表すことの 2 つの意味がありますが、これは C# では比較的まれです。
2.3 データ型変換
データ損失を引き起こしたり、例外をスローしたりする可能性のある変換には、明示的な変換が必要です。逆に、暗黙的な変換を実行することもできます。
2.3.1 表示変換
デフォルトでは、適合しないデータは代入中に静かにオーバーフローしますが、チェックされたブロックにコードを配置すると、実行時に System.OverflowException 例外がスローされます。
checked
{
int n = inr.MaxValue+1;
}
オーバーフロー チェックを強制しない未チェック ブロックもサポートします。
C# では、あいまいさの可能性を回避し、ユーザーが等価演算子を使用する必要があるときに代入演算子を使用できないようにするために、数値型からブール型への効率的な変換はサポートされていません。
2.3.2 暗黙的な変換
2.3.3 変換演算子を使用しない型変換
各数値データ型にはParse() メソッドが含まれており、文字列を対応する数値型に変換できます。特殊な型 System.Convert() も使用できます。
すべての型は ToString() メソッドをサポートします。
C# 2.0 以降、すべてのプリミティブ数値型には静的TryParse() メソッドが含まれています。Parse() との違いは、変換が失敗した場合に例外をスローする代わりに false を返すことです。
C#7.0 以降では、out パラメーターとしてのみ使用することを目的とした変数を最初に宣言する必要はなく、この変数は if の内部と外部の両方で使用できます。