.NET10でC#バージョンが14となる。C#14で言語仕様に追加された部分から使えそうなものを一部抜粋してみた。ただし、.NET10自体がPreview版なので、今後変更されることがあるかもしれない点は注意して欲しい。実際に試してみた環境は.NET10 Preview4である。
拡張メンバー
拡張メンバーはC#13までの拡張メソッドをより分かりやすくしたもの。
以下のような感じで定義可能。
// C# 14 拡張メンバー定義
public static class MyExtensions {
// string型変数の拡張メンバー
extension(string source) {
// 文字列を反転させる拡張メソッド
public string ReverseStr() {
return new string(source.Reverse().ToArray());
}
// 文字列が数字列かどうかを判定する拡張プロパティ
public bool IsNumber
{
get {
bool stat;
double d;
stat = double.TryParse(source,out d);
return stat;
}
}
}
// stringの拡張staticメソッド
extension(string) {
// string.IsAllZero(string)の様に使用する
public static bool IsAllZero(string str) {
bool stat = true;
foreach(var s in str) {
if (s != '0') {
stat = false;
break;
}
}
return stat;
}
}
}
extension(型 変数名)構文を使用することで、指定型のインスタンス拡張メンバーを定義出来る。また、extension(型)構文を利用し、staticメソッドを定義すると、指定型のstaticメソッドとなる。
(ちなみに、extention(型 変数名)ブロックで、staticメソッドを定義しても型のstaticメソッドになるようだ。ただし、上記変数名はstaticメソッド中では使用できない。)
string s = "123.456";
Console.WriteLine(s.ReverseStr());
Console.WriteLine(s.IsNumber);
Console.WriteLine(string.IsAllZero(s));
// 結果
// 654.321
// True
// False
C#13までは、インスタンスプロパティや型のstaticメソッドは定義できないのでちょっと便利かも。もちろん、今まで通りの定義も可能。
// C# 13以前の拡張メソッド定義
public static class MyExtensions13 {
public static string ReverseStr13(this string source) {
return new string(source.Reverse().ToArray());
}
}
fieldキーワード
fileldキーワードを使用すると、バッキングfieldを定義することなく、入力値のチェックや制限をかけることが可能。
// C# 14 fieldキーワード
public class MyClass {
/// <summary>
/// Valプロパティ(設定できる最大長を制限している)
/// fieldキーワードを指定すれば、バッキングfieldを宣言しなくても、
/// 制限等をかけることが可能。
/// </summary>
public string? Val {
set => field = value?.Length > 5 ? value.Substring(0,5) : value;
get;
}
}
var c = new MyClass();
c.Val = "1234";
Console.WriteLine(c.Val);
c.Val = "123456789";
Console.WriteLine(c.Val);
// 結果
// 1234
// 12345
ちょっとした機能追加だけど、それなりに使えそう。
最初にも書いたが、Preview版なので、今後変更されることがあるかもしれない。また、上記の機能を実際に試したい場合、.csprojの<PropertyGroup>に<LanguageVersion>preview</LanguageVersion>を追加する必要があるので注意。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>
後、何気に便利なのは、「Null 条件付き割り当て」。
これは、代入式の左辺で、Nullチェックを行なってくれる。
簡単な例
MyInstance?.Value = “Hello”;
みたいに使えて、MyInstanceがNullなら何もしない。