C#8.0 Essentials 第 4 章 – 演算子と制御フロー
4.1 演算子
一部の演算子は、+、-、?.、?? などの記号の形式で表示されますが、他の演算子は、 default や is などのキーワードです。
4.1.1 単項の正および負の演算子
単項正の演算子 (+) は値にほとんど影響せず、C# では冗長です。
4.1.2 二項算術演算子
C++ では、4+5; のようなバイナリ式を独立したステートメントとして使用できますが、C# では、代入、呼び出し、インクリメント、デクリメント、await、およびオブジェクト作成式のみが独立したステートメントとして使用できます。
優先順位と結合性は、演算子自体の実行順序にのみ影響し、オペランドの評価順序には影響しません。C# では、オペランドは常に左から右に評価されます。C++ では、C++ 仕様により、さまざまな実装でオペランドの評価順序を選択できます。
public static int A()
{
Console.WriteLine("A");
return 1;
}
public static int B()
{
Console.WriteLine("B");
return 2;
}
public static int C()
{
Console.WriteLine("C");
return 3;
}
static void Main(string[] args)
{
Console.WriteLine(A() + B() * C());
Console.ReadKey();
}
C#の場合、上記のコードはABC7を縦に出力しますが、C++の場合はABCの順とは限りません。
等価条件には 2 進浮動小数点型の使用を避け、差が許容範囲内であるかどうかを判断するか、10 進数型を使用してください。
C# で浮動小数点 0 を 0 で除算すると、「数値ではありません」という結果になります。負の数の平方根を取得すると、NaN も得られます。
浮動小数点数が境界を超えると、結果は正の無限大 (∞) または負の無限大 (-∞) として保存されます。
//输出-∞
Console.WriteLine(-1.0 / 0);
4.1.3 複合代入演算子
4.1.4 インクリメント演算子とデクリメント演算子
M(x++,x++) のような呼び出しの場合、x の初期値は 1 であると想定されます。C++ では、コンパイラによって決定される M(1,2) または M(2,1) のいずれかになります。 。C# は 2 つの保証を行っているため、C# は常に M(1,2) を呼び出します。1 つは、呼び出しに渡される実際のパラメーターが常に左から右に計算されること、2 つ目は、インクリメントされた値が常に変数に割り当てられ、その後、式(2番目の点がわかりませんでした)。
4.1.5 定数式と定数記号
定数式は、コンパイラが実行時ではなくコンパイル時に評価できる式です。
4.3 コードブロック
4.4 コードブロック、スコープ、宣言スペース
ローカル変数のスコープについて C++では、ブロック内で宣言されたローカル変数のスコープは、宣言位置から始まりブロックの最後までとなりますが、このときスコープ内に同名のものが他にある場合は、 , C++ では、名前はそのものへの参照に解決されます。C# は少し異なり、ローカル変数を宣言したブロックの場合、ローカル変数はスコープ内にありますが、宣言前にローカル変数を参照することはできません。つまり、ローカル変数は現時点では合法的に存在しますが、その使用は違法です。これは、C++ のような微妙なエラーを防ぐ C# の多くのルールの 1 つです。
4.5 ブール式
C# では条件がブール型である必要があるため、= の代わりに == を記述するという、C++ でよくあるコーディングミスを排除できます。
4.5.1 関係演算子と等価演算子
4.5.2 論理演算子
4.5.3 論理否定演算子
4.5.4 条件演算子
唯一の三項演算子であるため、単に三項演算子と呼ばれることがよくあります。
condition ? consequence : alternative
条件演算子は、何らかの形式の短絡評価も使用します。条件が true の場合は結果のみが評価され、それ以外の場合は代替のみが評価されます。
C# では、条件演算子の結果が代替式と同じ型である必要があり、型を判断するときに式のコンテキストをチェックしません。
4.6 null に関するプログラミング
4.6.1 NULL値のチェック
**== と !=** はすべてのバージョンの C# で使用できますが、クラスによってオーバーライドされ、パフォーマンスにわずかな影響を与える可能性があります。
**ReferenceEquals()** メソッドは、2 つの参照変数が同じデータ内容を持つかどうかを判断するのではなく、メモリ内の同じオブジェクトを指しているかどうかを判断するために使用されます。オーバーライドできないため、その動作は変更されません。
is パターン マッチング演算子は、変数がオブジェクトであるかどうかをテストして、null でないかどうかを判断します。C# 7.0 では、change 演算子が強化され、特に、値が null であるかどうかを判断する is null が提供されています。
is { } パターン マッチング演算子は、変数が null でないかどうかを判断するためにも使用できますが、利点はわずかです。変数が null 非許容型の場合、コンパイラは警告を発行します。
4.6.2 Null マージ演算子と Null マージ代入演算子
**null 合体演算子??** は、単に「この値が null の場合は、別の値を使用する」ことを意味します。短絡評価をサポートし、完全にリンクでき、連続書き込みが可能です、x??y??z。
C#8.0 では、等号の左側の変数が null でない場合に、null マージ代入演算子が導入されました。それ以外の場合、等号の左側の変数には、等号の右側の式の値が割り当てられます。name??= "name"; のようになります。
4.6.3空条件操作符
C#6.0 では、 null 条件演算子と呼ばれる ?. 演算子が導入されました。生成される演算結果は常に null 許容型で、配列へのアクセスにも使用できます。たとえば、segments?[0] は前提条件で動作します。配列が null ではないことを確認し、配列要素を取得します。
//C#8.0中数组及其元素均声明为可空
string?[]? segments;
4.6.4 Null 包含演算子
uri = string.Join('/',segments!);
C# 8.0 では、null 包含演算子 (!) を使用して警告を回避し、プログラマが変数が null であってはいけないことを保証できるが、ランタイム ライブラリは実行中に null 値をチェックすることをコンパイラに伝えることができます。
4.7 ビット演算子
4.7.1 シフト演算子
4.7.2 ビット演算子
&& とは異なり、& 演算子は左側が false であっても、常に両側を評価します。 | も同様です。
バイナリに変換できる組み込みの System.Convert.ToString(value,2) があります。
4.7.3 ビットごとの複合代入演算子
4.8 制御フローステートメント
4.8.1while および do/while ループ
4.8.2 for ループ
4.8.3foreach ループ
データ項目のコレクションに対して反復され、各項目は 1 回だけ反復され、カウント エラーは発生せず、設定された境界を越えることはできません。
foreach(type variable in collection)
statement
変数は読み取り専用変数です
4.8.4 基本的な switch ステートメント
switch(expression)
{
case constant:
statements
default:
statements
}
このグループのステートメントの終了点は「到達不能」である必要があります。つまり、次の switch セクションに「通過」または「貫通」することはできません。したがって、チョーク ステートメントは通常、break や return などのジャンプ ステートメントになります。または後藤。
switch ステートメントには少なくとも 1 つの switch セクションが必要です。switch{} は正当ですが、警告が生成されます。
C++ では、switch セクションがジャンプ ステートメントで終了していない場合、コントロールは次の switch セクションに「侵入」し、その中のコードを実行します。C++ ではエラーが発生しやすいため、C# ではコントロールを自然に渡すことはできません。あるスイッチセクションから次のスイッチセクションまで。ただし、goto ステートメントを使用して浸透を達成することはできます。
C# 7.0 では、スイッチのパターン マッチングが導入されています。
4.9ジャンプ文
4.9.1break ステートメント
4.9.2 continue ステートメント
4.9.3goto ステートメント
C# は goto をサポートしており、スイッチでの浸透を達成するためにのみ goto を使用できます。C# では、goto を介してコード ブロックにジャンプすることを禁止しているため、他の言語で発生する可能性のある goto の悪用のほとんどが回避されます。
4.10C# プリプロセッサ ディレクティブ
プリプロセッサ ディレクティブは、C# コンパイラにどのコードをコンパイルするかを指示し、コード内の特定のエラーや警告を処理する方法を示します。
C や C++ などの言語は、プリプロセッサを使用してコードを編成し、実際のコンパイル プロセスに参加せずにファイル内のコードをコンパイルする方法をコンパイラーに指示します。代わりに、C# コンパイラは、ソース コードに対して実行される通常の字句解析の一部としてプリプロセッサ ディレクティブを使用します。その結果、C# は高レベルのプリプロセッサ マクロをサポートせず、せいぜい定数の定義のみが許可されることになります。
4.10.1 コードの除外と組み込み
プリプロセッサ ディレクティブは、プラットフォーム間の違いを処理します。
4.10.2 プリプロセッサシンボルの定義
4.10.3 エラーと警告の生成
4.10.4 警告メッセージをオフにする
4.10.5警告:オプション
4.10.6 行番号の指定
4.10.7 ビジュアルエディターのプロンプト
C# では、#region ディレクティブを使用してコード領域を宣言できます。
4.10.8 NULL 許容参照型を有効にする
プリプロセッサ ディレクティブは、プラットフォーム間の違いを処理します。
4.10.2 プリプロセッサシンボルの定義
4.10.3 エラーと警告の生成
4.10.4 警告メッセージをオフにする
4.10.5警告:オプション
4.10.6 行番号の指定
4.10.7 ビジュアルエディターのプロンプト
C# では、#region ディレクティブを使用してコード領域を宣言できます。