第1回 明瞭なコーディングのために:特集:C# 7の新機能詳説(1/3 ページ)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは簡潔で分かりやすいコードを記述するために使える。
Visual Studio 2017とともにリリースされたC# 7には多くの新機能がある。それらの新機能はどのような場面で役立つのだろうか? 3回にわたって紹介していく。
- 第1回:明瞭なコーディングのために(本稿)
- 第2回:簡潔なコーディングのために
- 第3回:型による分岐の改良
C# 7の新機能
初めに、C# 7の新機能の一覧を示しておこう(本連載で取り上げないものも含む)。この一覧は「What's new in C# 7」によるものだ。
ここでの名称は英語を基本とし、括弧内に日本語訳を記載した(以降は、日本語訳を使う)。公式ドキュメントのサイト(Microsoft Docs)で未翻訳の用語は筆者が翻訳して[仮訳]と付記した。
- out variables(out変数):out変数をメソッド呼び出しの引数リスト内で宣言可能
- Tuples(タプル):ValueTuple型(System名前空間)の生成と分解
- Pattern Matching(パターンマッチ):is式とswith文の拡張、caseラベルのwhen句
- ref locals and returns([仮訳]参照ローカル変数と参照返値):引数を渡すときだけでなく、メソッドからの返値も参照で返せる。その参照返値は、参照ローカル変数に代入して使用する
- Local Functions(ローカル関数):メソッドやプロパティのgetter/setterなどの中に定義できるメソッド
- More expression-bodied members([仮訳]本体が式のメンバーの拡大):コンストラクタやプロパティのsetterなどもラムダ式で記述可能
- throw Expressions(throw 式):条件演算子(三項演算子)などの中からも例外をthrowできる
- Generalized async return types([仮訳]非同期の戻り値の型の一般化):軽量化のためにTask<T>の代わりに使える型を自作できる
- Numeric literal syntax improvements([仮訳]数値リテラル構文の改善):二進数用の接頭辞「0b」と、任意の桁区切り「_」
明瞭なコーディングのために使える新機能
C# 7の新機能の中で、数値リテラル構文の改善とローカル関数は、明瞭なコーディングに役立つ。数値リテラル構文の改善は数値リテラルの読み間違いを防ぎ、ローカル関数はそのメソッドのスコープを明確にする。
今回は、その2つの機能の使いどころを紹介していこう。
数値リテラル構文の改善
例えばbyte型の変数のそれぞれのbitをフラグとして使うとき、これまではその初期値として与える整数リテラルは10進数か16進数に限定されていたため、どのフラグが立つのか分かりにくいコードになっていた(次のコード)。対策としてコメントで2進数を併記して分かりやすくすることもあっただろうが、それはコードを修正したときにコメントを修正し忘れるリスクを負うものだった。
byte b1 = 0x95; // 1001 0101
各ビットをフラグとして使うbyte型変数の初期化。このようなときは2進数表記が分かりやすいのだが、C# 6まではできなかった。分かりやすくするためには、このようにコメントしておくくらいであった。
C# 7では、「0b」接頭辞によって2進数のリテラル表記が可能になった。さらに、「_」記号を数値リテラル内の任意の位置(接頭辞の直後は除く)に書けるようになったので、桁区切りも明確にできる。
// 接頭辞「0b」で2進数表記
byte b2 = 0b10010101;
// 「_」で桁区切りを入れて読みやすく
byte b3 = 0b1001_0101;
「_」記号による桁区切りは、10進数/16進数の整数や、浮動小数点数でも利用できる(次のコード)。
// 16進数を4桁ごとに区切る例
uint i1 = 0x800000a1;
uint i2 = 0x8000_00a1;
// 10進数を3桁ごとに区切る例
uint i3 = 2147483809;
uint i4 = 2_147_483_809;
// 小数点以下を3桁ごとに区切る例
double d1 = 0.00000001;
double d2 = 0.000_000_01;
16進数は4桁ごと、10進数は3桁ごとに区切ると読みやすい。小数点以下の部分にも使える。
Copyright© Digital Advantage Corp. All Rights Reserved.