演習 - 式を評価する
決定ロジックは、コードを介して代替経路を確立するために使用されます。ここで、どのパスに従うかの決定は、式の評価に基づいています。 たとえば、ユーザーの入力に基づいて 2 つのパスのいずれかを実行するようなコードを記述できます。 ユーザーが文字「a」を入力したときは、コードの 1 つのコード ブロックを実行します。 文字「b」を入力したときは、コードの別のコード ブロックを実行します。 この例では、文字列に割り当てられた値に基づいて実行パスを制御しています。 コード式、その式がどのように評価されるか、パスを定義するために使用されている基になるロジックに基づいて、コードの実行パスを選択します。
まず、式を構築して評価する方法を調べることから始めましょう。
式とは
式は、値 (リテラルまたは変数)、演算子、および 1 つの値を返すメソッドの任意の組み合わせです。 1 つのステートメントは C# の完全な 1 つの命令です。ステートメントは 1 つ以上の式で構成されます。 たとえば、次の if
"ステートメント" には、1 つの値を返す 1 つの "式" が含まれています。
if (myName == "Luiz")
式によって返される値は数値か文字列だと思っていたかもしれません。 アプリケーション開発者が、さまざまな目的でさまざまな種類の式を使用するのは事実です。 この場合、if
選択ステートメントを開発するときは、true
または false
のいずれかを返す式を使用します。 開発者は、この種類の式をブール式と呼びます。 コードにブール式が含まれている場合、戻り値は常に 1 つの true
または false
の値になります。
ブール式は重要です。なぜなら、コードでこれらの式を使用して、実行するコードのブロックを決定できるからです。
ブール式内で使用できる演算子には、さまざまな種類があります。 たとえば、上記の if
ステートメントでは、等値演算子 ==
を使用して、文字列変数に特定の値が代入されているかどうかをチェックしています。 選択する演算子は、使用可能なコード パス、パスに関連付けられている条件、基になるアプリケーション ロジックによって異なります。
等値と非等値の評価
最も一般的なコード評価の 1 つは、2 つの値が等しいかどうかを確認するためのチェックです。 等しいかどうかを確認するときは、チェック対象の 2 つの値の間に等値演算子 ==
を置きます。 等値演算子の両側の値が等しい場合、式によって true
が返されます。 それ以外の場合は、false
が返されます。
逆に、2 つの値が等しくないことを確認することが必要な場合もあります。 等しくないことを確認するには、2 つの値の間に非等値演算子 !=
を使用します。
等値演算子と非等値演算子の両方がなぜ必要なのか、疑問に思うかもしれません。 その理由は、分岐ステートメントの作成方法を学習し、実際にコードを記述し始めると、より明白になります。 反対のタスクを実行する 2 つの演算子を使用すると、表現力とコンパクト性を高めることができます。
次に、コーディング環境を準備し、ブール式を評価するコードの記述を開始します。
コーディング環境を準備する
このモジュールには、デモ コードをビルドして実行するプロセスをガイドする実践的なアクティビティが含まれています。 これらのアクティビティを完了するために、開発環境として Visual Studio Code を使用することをお勧めします。 これらのアクティビティに Visual Studio Code を使用すると、世界中のプロフェッショナルが使用する開発環境でコードの記述と実行をより快適に行うことができます。
Visual Studio Code を開きます。
Visual Studio Code は、Windows の [スタート] メニュー (別の OS の場合は同等のリソース) を使用して開くことができます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[フォルダーを開く] ダイアログで、Windows のデスクトップ フォルダーに移動します。
コード プロジェクトを保持するフォルダーの場所が別にある場合は、代わりにそのフォルダーの場所を使用できます。 このトレーニングでは、見つけやすく覚えやすい場所を用意することが重要です。
[フォルダーを開く] ダイアログで、[フォルダーの選択] を選びます。
作成者を信頼するかどうかを確認するセキュリティ ダイアログが表示された場合は、[はい] を選択します。
Visual Studio Code の [ターミナル] メニューで、[新しいターミナル] を選択します。
[ターミナル] パネルのコマンド プロンプトに、現在のフォルダーのフォルダー パスが表示されることを確認します。 次に例を示します。
C:\Users\someuser\Desktop>
Note
サンドボックスやホスト環境ではなく、自分の PC で作業しており、この C# シリーズの他の Microsoft Learn モジュールを完了している場合は、コード サンプル用のプロジェクト フォルダーが既に作成されている可能性があります。 その場合は、次の手順 (TestProject フォルダーにコンソール アプリを作成するために使用される) をスキップできます。
ターミナルのコマンド プロンプトで、指定したフォルダーに新しいコンソール アプリケーションを作成するには、「dotnet new console -o ./CsharpProjects/TestProject」と入力し、Enter キーを押します。
この .NET CLI コマンドでは、.NET プログラム テンプレートを使用して、指定したフォルダーの場所に新しい C# コンソール アプリケーション プロジェクトを作成します。 このコマンドでは、CsharpProjects および TestProject フォルダーが自動的に作成され、
.csproj
ファイルの名前として TestProject が使用されます。[エクスプローラー] パネルで、CsharpProjects フォルダーを展開します。
[TestProject] フォルダーと、Program.cs という名前の C# プログラム ファイルと、TestProject.csproj という名前の C# プロジェクト ファイルの 2 つが表示されるはずです。
[エクスプローラー] パネルの [エディター] パネルにコード ファイルを表示するには、[Program.cs] を選択します。
既存のコード行を削除します。
この C# コンソール プロジェクトを使用して、このモジュール中のコード サンプルを作成、ビルド、および実行します。
[ターミナル] パネルを閉じます。
等値演算子を使用する
Visual Studio Code が開いていて、[エディター] パネルに Program.cs が表示されていることを確認します。
Note
Program.cs は空になっているはずです。 そうでない場合は、すべてのコード行を選択して削除します。
Visual Studio Code エディターに次のコードを入力します。
Console.WriteLine("a" == "a"); Console.WriteLine("a" == "A"); Console.WriteLine(1 == 2); string myValue = "a"; Console.WriteLine(myValue == "a");
Visual Studio Code の [ファイル] メニューで、[保存] を選択します。
コードをビルドまたは実行する前に、Program.cs ファイルを保存する必要があります。
[エクスプローラー] パネルで、TestProject フォルダーの場所にあるターミナルを開くには、TestProject を右クリックし、[統合ターミナルで開く] を選択します。
[ターミナル] パネルが開きます。 ターミナルには、そのターミナルが TestProject フォルダーの場所で開いていることを示すコマンド プロンプトが含まれているはずです。
[ターミナル] のコマンド プロンプトで、コードを実行するには「dotnet run」と入力し、Enter キーを押します。
Note
"実行するプロジェクトが見つかりませんでした" というメッセージが表示された場合は、ターミナルのコマンド プロンプトに、予期されている TestProject フォルダーの場所が表示されていることを確かめます。 例:
C:\Users\someuser\Desktop\csharpprojects\TestProject>
次の出力が表示されます。
True False False True
文字列の組み込みヘルパー メソッドを使用して文字列の等価性のチェックを改善する
行 Console.WriteLine("a" == "A");
によって false
が出力されることに驚くかもしれません。 文字列を比較する場合、大文字と小文字が重要です。
また、次のコード行を考えてみましょう。
Console.WriteLine("a" == "a ");
ここでは、文字列の末尾に空白文字を追加しました。 この式でも false
が出力されます。
場合によっては、テキストの前または後にスペース文字があっても完全に許容される場合があります。 ただし、不正確な一致を受け入れる必要がある場合は、最初にデータを "処理" することができます。 データの "処理" とは、等しいかどうかの比較を実行する前にクリーンアップを実行することを意味します。
たとえば、ループ内でユーザー入力を収集する場合を考えてみましょう。 各値が入力された後、続行するかどうかを確認するプロンプトをユーザーに表示できます (例: Do you want to continue (Y/N)?
)。 続行する場合、ユーザーはおそらく「y
」または「Y
」を入力します。 y
と Y
は等しくありませんが、コードで両方の値が等しいと解釈する必要があります。
2 つの文字列値の等しさをチェックする前、特に一方または両方の値がユーザーによって入力された場合は、次のようにする必要があります。
- あらゆる文字列値に対して
ToUpper()
またはToLower()
ヘルパー メソッドを使用して、両方の文字列がすべて大文字であるか、すべて小文字であることを確認します。 - あらゆる文字列値に対して
Trim()
ヘルパー メソッドを使用して、先頭または末尾の空白文字を削除します。
次のコード リストに示すように、両方の値にこれら 2 つのヘルパー メソッドを連結することで、前述の等価性チェックを改善できます。
Visual Studio Code エディターのコードを次のコードで置き換えます。
string value1 = " a"; string value2 = "A "; Console.WriteLine(value1.Trim().ToLower() == value2.Trim().ToLower());
コード ファイルを保存してから、Visual Studio Code を使ってコードを実行します。
コードを実行すると、今度は True が出力されることに注目してください。
非等値演算子を使用する
行コメント演算子
//
を使用して、前の手順のコードをすべてコメントアウトします。Visual Studio Code エディターに次のコードを入力します。
Console.WriteLine("a" != "a"); Console.WriteLine("a" != "A"); Console.WriteLine(1 != 2); string myValue = "a"; Console.WriteLine(myValue != "a");
コード ファイルを保存してから、Visual Studio Code を使ってコードを実行します。
次の出力が表示されます。
False True True False
予想どおり、非等値演算子を使用した場合の結果は、等値演算子を使用したときに表示された結果とは逆になります。 これは、コードが逆の方法でも分岐することを意味します。これは、まさに必要なものになり得ます。
比較の評価
数値データ型を使用する場合、ある値が別の値より大きいか、または小さいかを判断することが必要なことがあります。 これらの種類の比較を実行するには、次の演算子を使用します。
- 大なり
>
- 小なり
<
- 以上
>=
- 以下
<=
当然ながら、上記の文字列値の比較に使用した演算子 ==
と !=
も、数値データ型を比較するときに使用できます。
比較演算子を使用する
行コメント演算子
//
を使用して、前のタスクのコードをすべてコメントアウトします。Visual Studio Code エディターに次のコードを入力します。
Console.WriteLine(1 > 2); Console.WriteLine(1 < 2); Console.WriteLine(1 >= 1); Console.WriteLine(1 <= 1);
コード ファイルを保存してから、Visual Studio Code を使ってコードをビルドし、実行します。
次の出力が表示されます。
False True True True
ブール値を返すメソッド
一部のメソッドではブール値 (true
または false
) が返されます。 次の演習では、String
クラスの組み込みメソッドを使用して、より大きな文字列に、アプリケーションにとって重要な特定の単語または語句が含まれているかどうかを判断します。
Note
一部のデータ型には、役に立つユーティリティ タスクを実行するメソッドがあります。 String
データ型には、それらの多くが含まれています。 Contains()
、StartsWith()
、EndsWith()
を含むブール値を返すものが複数あります。 詳細については、Microsoft Learn モジュール「C# の String クラス メソッドを使用して英数字データを操作する」を参照してください。
ブール値を返すメソッドを使用する
行コメント演算子
//
を使用して、前の手順のコードをすべてコメントアウトします。Visual Studio Code エディターに次のコードを入力します。
string pangram = "The quick brown fox jumps over the lazy dog."; Console.WriteLine(pangram.Contains("fox")); Console.WriteLine(pangram.Contains("cow"));
コード ファイルを保存してから、Visual Studio Code を使ってコードをビルドし、実行します。
次の出力が表示されます。
True False
論理否定とは
"論理否定" という用語は、単項否定演算子!
を指します。 一部の人たちは、この演算子を "Not 演算子" と呼んでいます。 条件式 (true
または false
のいずれかに評価されるコード) の前に !
演算子を配置すると、コードは、オペランドの評価を逆転するように強制されます。 論理否定が適用されると、オペランドが false
に評価された場合は true
が評価で生成され、オペランドが true
に評価された場合は false
が生成されます。
これらの考え方の関係を確認するのに役立つ可能性のある例を次に示します。 次の 2 行のコードで生成される結果は同じです。 2 行目はよりコンパクトです。
// These two lines of code will create the same output
Console.WriteLine(pangram.Contains("fox") == false);
Console.WriteLine(!pangram.Contains("fox"));
論理否定演算子を使用する
行コメント演算子
//
を使用して、前の手順のコードをすべてコメントアウトします。Visual Studio Code エディターに次のコードを入力します。
string pangram = "The quick brown fox jumps over the lazy dog."; Console.WriteLine(!pangram.Contains("fox")); Console.WriteLine(!pangram.Contains("cow"));
コード ファイルを保存してから、Visual Studio Code を使ってコードをビルドし、実行します。
次の出力が表示されます。
False True
非等値演算子と論理否定
非等値演算子 !=
には、!
文字が含まれますが、論理否定と混同しないようにしてください。 非等価演算子は、そのオペランドが等しくない場合は true
を返し、オペランドが等しい場合は false
を返します。 組み込み型のオペランドの場合、式 x != y
は、式 !(x == y)
と同じ結果を生成します (論理否定の例)。
次のコード サンプルは、!=
演算子の使用例を示しています。
int a = 7;
int b = 6;
Console.WriteLine(a != b); // output: True
string s1 = "Hello";
string s2 = "Hello";
Console.WriteLine(s1 != s2); // output: False
まとめ
ここまでに学習したブール式の評価に関する要点は次のとおりです。
true
またはfalse
に評価される式には、さまざまな種類があります。==
演算子を使用して、等しいかどうかを評価します。- 文字列が等しいかどうかを評価するには、文字列の大文字と小文字が異なる可能性や、先頭または末尾のスペースが異なる可能性を考慮する必要があります。 状況によっては、
ToLower()
、ToUpper()
、Trim()
の各ヘルパー メソッドを使用すると、2 つの文字列が等しくなる確率が高まります。 !=
演算子を使用して、等しくないかどうかを評価します。>
、<
、>=
、<=
などの比較演算子を使用して、より大きい、より小さいといった操作を評価します。- メソッドによってブール値が返される場合、それをブール式として使用できます。
- 指定した式の逆を評価するには、論理否定演算子
!
を使用します。