C#のGitHubページには魅力的なアイデアの長いリストがあり、頭痛の種のいくつかはまだ議論中です。C#10に含まれる新機能を正確に知りたい場合は、11 月にリリースされるまで待つことができます。または、C#チームのお気に入りの機能のデモンストレーションをフォローすることもできます。最近のMicrosoft Buildカンファレンスで、C#のリードデザイナーであるMads Torgersen氏は、現在進行中の作業のいくつかを明らかにしました。以下は、言語の次のバージョンで提供される5つの新機能です。

1. global using
C#のソースコードファイルは通常、多くの名前空間をインポートします。以下は、一般的なASP.NET Webアプリケーションのコードスニペットです。
using LoggingTestApp.Data;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LoggingTestApp
{
public class Startup
{
...
}
}
このコードは特別なものではない。以前は、名前空間のインポートにより、クラスが使用しているライブラリをすばやく確認できました。しかし、今では誰も見ないコードを書かなければならないコードの束に過ぎません。
C#10では、キーワードglobalを使用してプロジェクト全体の名前空間インポートを定義できる新しいスキーマが導入されました。推奨されるのは、グローバルインポートをusings.csまたはimports.csという名前の別のファイル(プロジェクトごとに1つ)に置くことです。その内容はおおよそ:
global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.HttpsPolicy;
global using Microsoft.AspNetCore.Identity;
global using Microsoft.AspNetCore.Identity.UI;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
元のファイルを単純化できます:
using LoggingTestApp.Data;
using Serilog;
namespace LoggingTestApp
{
public class Startup
{
...
}
}
Visual Studioは、重複する名前空間(グローバルファイルとローカルファイルの両方にインポートされた名前空間)をハイライトします。これはエラーではありませんが、重複する名前空間を削除するとコード量が減り、特定のファイルが使用している特殊な名前空間に集中できます。
2. ファイル范囲の名前
C#10はコードを単純化する別の方法を提供している:ファイルスコープの名前空間を宣言する。ファイル範囲の名前空間はファイル全体に自動的に適用され、インデントは必要ありません。
言い換えれば、以下のように書く。
namespace LoggingTestApp
{
public class Startup
{
...
}
}
以下になる。
namespace LoggingTestApp;
public class Startup
{
...
}
ファイル範囲の名前空間を使用しているファイルに名前空間ブロックを追加すると、ネストされた名前空間が作成されます。
namespace Company.Product;
// This block creates the namespace Company.Product.Component
namespace Component
{
}
C#の設計者は、この変更が水平スペースの無駄をクリーンアップすると主張した(グローバルな使用が垂直スペースの無駄をクリーンアップするように)。全体的な目標は、コードを短く、狭く、簡潔にすることです。しかし、これらの変更は初心者がC#を学ぶのを難しくします。グローバルな使用とファイル全体の名前空間を組み合わせることで、Hello Worldコンソールアプリケーションを数行のコードで作成できます。
3. 空のパラメータチェック
定型コードを減らすという精神で、C#には本当に素晴らしい新機能があります。null値をチェックするメソッドを書いたことがあります。例えば、以下のコード:
public UpdateAddress(int personId, Address newAddress)
{
if (newAddress == null)
{
throw new ArgumentNullException("newAddress");
}
...
}
パラメータ名の末尾に“!!”を追加するだけです。C#は自動的にこの空パラメータチェックを追加します。上記のコードは以下のように簡略化できる。
public UpdateAddress(int personId, Address newAddress!!)
{
...
}
アドレスにnull値を渡すと、自動的にArgumentNullExceptionがスローされます。
この詳細は些細なことに見えるかもしれませんが、実際には言語を最適化する非常に簡単で貴重な方法です。多くの研究によると、プログラムエラーの原因は、コード内の概念が複雑すぎるためではなく、コードを読むのが疲れ、人間の注意力が限られているため、非常に避けやすいエラーの繰り返しによって引き起こされることが多い。コードの量を減らすことで、コードのレビューにかかる時間、コードの処理にかかる認知負荷、注意力の低下によるエラーの無視の可能性を減らすことができます。
4. required属性
以前は、オブジェクトを正しく作成するためにクラスコンストラクタでしかできませんでした。今日では、以下のレコードに自動的に実装されたプロパティのような、より軽量な構造を使用しています。
public record Employee
{
public string Name { get; init; }
public decimal YearlySalary { get; init; }
public DateTime HiredDate{ get; init; }
}
このような軽量オブジェクトのインスタンスを作成するとき、オブジェクトの初期化構文を使用することができます:
var theNewGuy = new Employee
{
Name = "Dave Bowman",
YearlySalary = 100000m,
HiredDate = DateTime.Now()
};
しかし、オブジェクトの特定のプロパティが必要な場合はどうなりますか?以前と同じようにコンストラクタを追加することもできますが、より多くの定型コードを追加する必要があります。さらに、パラメータからプロパティに値をコピーすることも、理解しやすいがよくある間違いです。
C#10で導入されたキーワードrequiredは、この問題を排除する。
public record Employee
{
public required string Name { get; init; }
public decimal YearlySalary { get; init; }
public DateTime HiredDate{ get; init; }
}
そのため、Name属性を設定しないとEmployeeを作成できません。
5. キーワードフィールド
長年にわたり、C#チームはプロパティの自動実装でコードを簡素化するために多大な努力をしてきました。上記のEmployeeレコードは、getキーワードとinitキーワードを使用して3つの不変プロパティを宣言した良い例です。データは3つのプライベートフィールドに格納されますが、これらのフィールドはすべて自動的に作成され、人間の介入なしに作成されます。これらのフィールドを見ることはありません
自動実装されたプロパティは素晴らしいですが、その役割もそれに限られます。自動的に実装されたプロパティを使用できない場合は、C#2に戻ったように、サポートフィールドをクラスに追加し、通常のプロパティメソッドを記述する必要があります。しかし、C#10では、サポートフィールドを自動的に作成するキーワードfieldが提供されています。
たとえば、初期プロパティ値を処理するレコードを作成したいとします。以下のコードでは、Employeeクラスにいくつかの変更を加え、HiredDateフィールドにDateTimeオブジェクトからの日付情報のみが含まれるようにします(時刻情報は含まれません)。
public record Employee
{
public required string Name { get; init; }
public decimal YearlySalary { get; init; }
public DateTime HiredDate{ get; init => field = value.Date(); }
}
このコードはクリーンでシンプルで、宣言型に近いです。
フィールドキーワードを使用して、get、set、initのフィールドにアクセスできます。また、通常のクラスのプロパティと同様に、プロパティを検証する必要がある場合があります。
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
if (value.Trim() == "")
throw new ArgumentException("No blank strings");
_firstName = value;
}
}
フィールドを使用して自動実装プロパティを検証できます。
public string FirstName {get;
set
{
if (value.Trim() == "")
throw new ArgumentException("No blank strings");
field = value;
}
}
基本的に、プロパティのデータ型を変更する必要がない限り、サポートフィールドを自己宣言する必要はありません。
6. まとめまとめまとめ
もちろん、C#10にはこれら5つ以上の新機能があります。いくつかの式の変更と、インターフェイス内で静的メンバーを定義するという議論の余地もあります。忍耐強く待つしかない。
全体として、C#10の開発の焦点は明確です。コード量の削減、利便性の向上、開発者の負担の軽減です。
著者マシュー·マクドナルド
原文へのリンク:https//medium.com/young-coder/a-closer-look-at-5-new-features-in-c-10-f99738b0158e
翻訳者:月。
タグ:Ohan Zhu
制作:CSDN(ID:CSDNnews)
注:この記事はCSNによって翻訳され、ソースを明記してください。