C# 6.0とは?静的インポート・自動プロパティ初期化子・nameof 演算子
- システム
エンジニア - C# 6.0から追加された新機能では、ソースコードの記述が簡単になると聞きました。どのような機能があるのですか。
- プロジェクト
マネージャー - そうですね。記述が簡単になりコードがスッキリとした印象になりました。
C# 6.0とは?
C# 6.0は2015年7月にリリースされたC#のバージョンです。この記事を執筆している時点でC#は9.0までがリリースされていますが、6.0では重要な機能が追加されているのでそこに絞って解説します。
特にC# 6.0はソースコードの記述を簡潔にできる機能が多く追加されています。この記事ではC# 6.0で追加された主な機能について分かりやすく紹介するので、是非ご覧下さい。
静的インポート
C#で標準で使える静的メンバーは、従来は以下のように「クラス名.メンバー名」で指定する必要がありました。
1
2
3
4
5
6
7
8
9
10
|
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Math.PI);
}
}
|
C# 6.0からはusing staticを使うことで以下のようにメンバー名だけで呼び出すことができます。ソースコードがすっきりしますね。
1
2
3
4
5
6
7
8
9
10
11
|
using System;
using static System.Math;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(PI);
}
}
|
なお実行結果は「3.141592653589793」が表示されます。
例外フィルター
C# 6.0の例外フィルターとはtry~catch文で、when節でキャッチする例外に条件を付けることが出来る機能です、以下のように利用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
try
{
throw new Exception(""b"");
}
catch (Exception e) when (e.Message == ""a"")
{
Console.WriteLine(""例外aが発生しました。"");
}
catch (Exception e) when (e.Message == ""b"")
{
Console.WriteLine(""例外bが発生しました。"");
}
|
実行結果は「例外bが発生しました。」と表示されます。例外発生時に渡されたメッセージをwhenで判定できることがわかりますね。
自動プロパティ初期化子
C#は3.0からクラスのプロパティの宣言を「プロパティ名 { get; set; }」といった簡潔な記述ができるようになりました。これを自動プロパティと言います。しかしプロパティに初期値を持たせたい場合は自動の記述をやめるか、以下のようにコンストラクタで代入する必要がありました。
1
2
3
4
5
6
7
8
9
10
|
class Test
{
public int test { get; set; }
public Test()
{
test = 100;
}
}
|
C# 6.0からは以下のように自動プロパティの宣言に「= 初期値;」を記述するだけで、初期化できるようになりました。
1
2
3
4
5
|
class Test
{
public int test { get; set; } = 100;
}
|
式形式のメンバー
C# 6.0からは、クラスのメンバーのメソッドが一つの式のみの場合は「=>」を使って簡潔に記述できるようになりました。例えば以下のような場合は、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Test
{
public static int Multi(int x, int y)
{
return x * y;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Test.Multi(3, 4));
}
}
|
Testクラスを以下のように記述することができます。記述の量を減らすことができますね。なお実行結果は「12」が表示されます。
1
2
3
4
5
|
class Test
{
public static int Multi(int x, int y) => x * y;
}
|
Null 条件演算子 その1
C#では「対象がnullではない時だけ処理をして、nullの場合はnullを返す」と言う処理が多くなります。その結果nullチェックのif文ばかりになってしまいます。以下がその例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Test
{
public string str;
public static int? StrLength(Test t)
{
if (t == null) return null;
string s = t.str;
if (s == null) return null;
return s.Length;
}
}
class Program
{
static void Main(string[] args)
{
Test tes = new Test();
tes.str = ""テスト"";
Console.WriteLine(Test.StrLength(tes));
}
}
|
Null 条件演算子 その2
上の例は生成したTestクラスのstringのメンバーの長さを取得して表示しますが(実行結果は「3」です)、StrLengthメソッド内部ではクラスや文字列がnullでないかif文でチェックしてくどくなっています。C# 6.0ならNull条件演算子でTestクラスが以下のように簡潔になります。
1
2
3
4
5
6
|
class Test
{
public string str;
public static int? StrLength(Test t) => t?.str?.Length;
}
|
Null 条件演算子 その3
Null条件演算子はインデクサーに対しても使えます。以下の実行結果は「ス」になります。「テスト」を0から数えて1番目の文字ということですね。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Test
{
public string str;
public static char? GetChar(Test t,int idx) => t?.str?[idx];
}
class Program
{
static void Main(string[] args)
{
Test tes = new Test();
tes.str = ""テスト"";
Console.WriteLine(Test.GetChar(tes, 1));
}
}
|
文字列補間
C# 6.0以前は、文字列に変数の値を埋め込む場合、以下のようにFormatメソッドを利用していました。
1
2
3
|
int a = 3, b = 4;
Console.WriteLine(string.Format(""数字の{0}と{1}。"", a, b));
|
実行すると「数字の3と4。」と表示されます。C# 6.0からこの記述を以下のように$を使って簡潔に書くことができるようになりました。
1
2
3
|
int a = 3, b = 4;
Console.WriteLine($""数字の{a}と{b}。"");
|
nameof 演算子
C# 6.0からnameofという演算子が追加され、クラスやフィールドなどの名前を文字列として取得できるようになりました。デバッグに活用できますね。以下のように利用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Test
{
public int value;
public void DispValue()
{
Console.WriteLine(value);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(nameof(Object));
Console.WriteLine(nameof(String));
Console.WriteLine(nameof(Test));
Console.WriteLine(nameof(Test.value));
Console.WriteLine(nameof(Test.DispValue));
}
}
|
実行結果は以下の通りです。
Object
String
Test
value
DispValue
- システム
エンジニア - using staticでメンバー名を呼び出すことができ、またNull 条件演算子が簡潔になり、記述しやすいことが良くわかりました。
- プロジェクト
マネージャー - コードが簡潔に記述できると、すぐチェックができ、作業がしやすくなりますね。
C# 6.0の新機能を活用しよう
C# 6.0の主な新機能を解説しましたが、ご理解頂けましたでしょうか。
この記事を執筆した時点では9.0がリリースされているのでどれも新しい機能とは言えませんが、知らないものもあったかもしれませんね。是非活用してください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)