演習 - 暗黙的なデータ変換を使用して追加を実行する
多くの場合、数値データに数学演算を実行する必要があります。 このユニットは加算から始めます。次のユニットには、C# コンパイラを使用したコードの解析と解釈の方法について学習する重要なレッスンがあるため、そちらの方で他の演算についても説明します。
2 つの数値を加算する
2 つの数値を加算するには、"加算演算子" (プラス記号 +
) を使用します。 そうです。文字列連結に使用するものと同じプラス記号 +
が加算にも使用されます。 1 つの記号を複数の目的で再び用いることは "演算子のオーバーロード" と呼ばれることがあり、C# では頻繁に行われます。
この場合、ユーザーの意図は C# コンパイラに理解されます。 コンパイラでは、コードが解析され、2 つの数値 (オペランド) によって +
(演算子) が囲まれていることが認識されます。 変数のデータ型 (両方とも int
) を指定すると、これら 2 つの値を追加することを意図したものとなります。
.NET エディターに次のコードを入力します。
int firstNumber = 12; int secondNumber = 7; Console.WriteLine(firstNumber + secondNumber);
このコードを実行すると、出力コンソールに次の結果が表示されます。
19
データ型を組み合わせ、暗黙的な型変換を強制する
+
記号と共に string
値と int
値の両方を使用するとどうなるでしょうか。
記述したコードを次のコードに合わせて修正します。
string firstName = "Bob"; int widgetsSold = 7; Console.WriteLine(firstName + " sold " + widgetsSold + " widgets.");
このコードを実行すると、出力コンソールに次の結果が表示されます。
Bob sold 7 widgets.
この例では、ユーザーが +
記号を使用して 2 つのオペランドを連結することを望んでいる、というのが C# コンパイラによる理解です。 そう推論されるのは、+
記号が string
データ型と int
データ型のオペランドに囲まれているためです。 そこで、残りの文字列と連結できるよう、int
変数 widgetsSold
を string
に一時的に暗黙的変換することが試行されます。 C# コンパイラでは、できる限りユーザーを支援すべく試行されますが、自分の意図について明示的になることが理想的です。
数値の加算と文字列の連結のさらに高度な例を試す
記述したコードを次のコードに合わせて修正します。
string firstName = "Bob"; int widgetsSold = 7; Console.WriteLine(firstName + " sold " + widgetsSold + 7 + " widgets.");
このコードを実行すると、出力コンソールに次の結果が表示されます。
Bob sold 77 widgets.
int
変数 widgetsSold
をリテラル int
7
に追加する代わりに、コンパイラでは、すべて文字列として処理され、まとめて連結されます。
意図を明確に示すためにコンパイラにかっこを追加する
記述したコードを次のコードに合わせて修正します。
string firstName = "Bob"; int widgetsSold = 7; Console.WriteLine(firstName + " sold " + (widgetsSold + 7) + " widgets.");
このコードを実行すると、出力コンソールに次の結果が表示されます。
Bob sold 14 widgets.
かっこ記号 ()
がもう 1 つのオーバーロードされた演算子になります。 この場合、数式と同じように、左かっこと右かっこで "演算の順序" が形成されます。 最も内側にあるかっこを最初に解決し、結果的に、int
値、widgetsSold
値、および 7
値を加算することが今回の意図であると指示します。 これが解決されると、残りのメッセージと連結できるよう、結果が暗黙的に文字列に変換されます。
Note
計算と連結の両方を 1 つのコード行で実行することは避けるべきでしょう。 ここの要点は、演算子とオペランドをコンパイラの視点で見る方法を理解するのに役立ちます。
まとめ
C# の数学演算についてこれまでに学習した内容を次に示します。
- 数値に数学的加算を実行できます。
- 文字列連結と加算の両方でプラス (
+
) 記号が使用されます。 これは "演算子のオーバーロード" と呼ばれており、演算中のデータ型に基づいて適切な使用方法がコンパイラによって推論されます。 - 可能であれば、C# コンパイラでは、数字の文字列表現を表示目的で連結することが開発者の意図であることが明らかな場合、暗黙的に
int
がstring
に変換されます。 - かっこを使用して演算の順序を定義し、特定の演算を他の演算の前に実行する意図があることをコンパイラに明示的に伝えます。