C#6.0の新機能

画像

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新機能は、コンパイラの現在のバージョンで説明されていますが、最終バージョンのリリースによって構文が変更される場合があります。

Source: https://habr.com/ru/post/J249555/


All Articles