Microsoftは、開発者向けのVisual Studio 2015および.Net 4.6のプレビューバージョンをリリースしました。 新しいC#6.0には、コーディングを容易にするいくつかの新しい機能があります。
この記事では、C#6.0の新機能について説明します。 新しいVSはここからダウンロードできます。
Microsoft Visual Studio Ultimate 2015プレビュー
値を使用してプロパティを初期化する
C#6.0では、値を値の右側に書き込むことで、値でプロパティを初期化できます。 これにより、nullおよび空のプロパティ値によるエラーを回避できます。
前:
public int Id { get; set; } public string FirstName { get; set; }
今:
public int Id { get; set; } = 1001; public string FirstName { get; set; } = "Srinivas";
文字列補間
毎日、文字列の連結に対処する必要があります。 主に「+」演算子を使用する人もいれば、string.Format()メソッドを使用する人もいます。 個人的にはstring.Format()が好きです。 しかし、誰もがそれに関する問題を知っています。パラメーターが多すぎると、各数字の意味を理解するのが難しくなります-{1}、{2}、{3}。 C#6.0は、両方の方法の長所を組み合わせた新しい機能を考案しました。
前:
name = string.Format("Employee name is {0}, located at {1}", emp.FirstName, emp.Location);
今:
name = $"Employee name is {emp.FirstName}, located at {emp.Location}";
労働者のILコードの要求に応じて
IL_0000: nop IL_0001: ldstr "Ivan" IL_0006: stloc.0 IL_0007: ldstr "Moscow" IL_000c: stloc.1 IL_000d: ldstr "Employee name is {0}, located at {1}" IL_0012: ldloc.0 IL_0013: ldloc.1 IL_0014: call string [mscorlib]System.String::Format(string, object, object) IL_0019: stloc.2 IL_001a: ret
条件も使用できます。
name = $"Employee name is {emp.FirstName}, located at {emp.Location}. Age of employee is {(emp.Age > 0) ? emp.Age.ToString() : "N/A"}";
ラムダ式を使用する
C#6.0では、ラムダ式を使用してプロパティとメソッドを定義できます。 これにより、コードの量が大幅に削減されます。
前:
public string[] GetCountryList() { return new string[] { "Russia", "USA", "UK" }; }
今:
public string[] GetCountryList() => new string[] { "Russia", "USA", "UK" };
静的クラスをインポートする
クラスのすべての静的メンバーは、別の静的クラスを使用して定義できます。 しかし、この静的クラスの名前を常に繰り返す必要があります。 多数のプロパティを使用すると、同じことを何度も繰り返す必要があります。
C#6.0では、静的クラスを使用してキーワードを使用してインポートする機能が導入されました。 数学ライブラリの使用例を見てみましょう。
以前は
double powerValue = Math.Pow(2, 3); double roundedValue = Math.Round(10.6);
今:
using System.Math; double powerValue = Pow(2, 3); double roundedValue = Round(10.6);
これはクラス内だけでなく、メソッドの実行時にも使用できます。
前:
var employees = listEmployees.Where(i => i.Location == "Bangalore");
今:
using System.Linq.Enumerable; var employees = Where(listEmployees, i => i.Location == "Bangalore");
ヌル条件ステートメント
C#6.0では、いわゆるヌル条件演算子(?。)が導入されました。これは、条件演算子(?:)の上で機能します。 その目的は、NULL値のチェックを容易にすることです。
演算子が適用されるクラスオブジェクトがnullの場合、null値を返します。
var emp = new Employee() { Id = 1, Age = 30, Location = "Bangalore", Department = new Department() { Id = 1, Name = "IT" } };
前:
string location = emp == null ? null : emp.Location; string departmentName = emp == null ? null : emp.Department == null ? null : emp.Department.Name;
今:
string location = emp?.Location; string departmentName = emp?.Department?.Name;
nameof演算子
C#6.0では、nameof演算子を使用して、コード内の文字列プロパティリテラルの出現を回避します。 この演算子は、渡された要素の文字列リテラルを返します。 クラスの任意のメンバーまたはクラス自体をパラメーターとして渡すことができます。
var emp = new Employee() { Id = 1, Age = 30, Location = "Moscow", Department = new Department() { Id = 1, Name = "IT" } }; Response.Write(emp.Location); //result: Moscow Response.Write(nameof(Employee.Location)); //result: Location
キャッチで待ち、最後にブロックする
C#6.0より前は、catchおよびfinalブロックでawait演算子を使用できませんでした。 今、そのような機会が現れました。 リソースを解放したり、エラーログを保持したりするために使用できます。
public async Task StartAnalyzingData() { try { // } catch { await LogExceptionDetailsAsync(); } finally { await CloseResourcesAsync(); } }
例外フィルター
例外フィルターはCLRにあり、VBで使用可能ですが、C#では使用できませんでした。 これでこの機能が登場し、例外に追加のフィルターを課すことができます:
try { // } catch (ArgumentNullException ex) if (ex.Source == "EmployeeCreation") { // } catch (InvalidOperationException ex) if (ex.InnerException != null) { // } catch (Exception ex) if (ex.InnerException != null) { // }
辞書の初期化
C#6.0は、値キーによって辞書を初期化する機能を追加しました。 これにより、辞書の初期化が簡単になります。
たとえば、JSONオブジェクトの場合:
var country = new Dictionary<int, string> { [0] = "Russia", [1] = "USA", [2] = "UK", [3] = "Japan" };
C#6.0には、多くの構文変更と新機能があります。 マイクロソフトは、パフォーマンスの面でも新しいコンパイラを改善しています。
PS新機能は、コンパイラの現在のバージョンで説明されていますが、最終バージョンのリリースによって構文が変更される場合があります。