文字列補完

$を付けたダブルクォートの内で {変数名} でその値が埋め込まれる

var (year, month, day) = (2025, 6, 27);
var (hour, minute, second) = (12, 30, 45);

Console.WriteLine($"日時:{year}-{month}-{day} {hour}:{minute}:{second}");

従来なら・・

var (year, month, day) = (2025, 6, 27);
var (hour, minute, second) = (12, 30, 45);

Console.WriteLine("日時:{0}-{1}-{2} {3}:{4}:{5}", year, month, day, hour, minute, second);

数値と変数の位置を確認しながらみないといけないので直観的でなかったのが、
直接埋め込めるので可読性が上がっている

C#11.0で生文字列リテラルが追加されたんでさらに自由度があがっている

投稿日時: 2025-06-26 16:13:26
更新日時: 2025-06-26 16:17:26

インデックス初期化子

インデックスを使った構文で初期化できる


var data = new Dictionary<string, int> {
    ["sample1"] = 100,
    ["sample2"] = 200,
    ["sample3"] = 300
};

従来の初期化方法

従来の書き方はこれ

var data = new Dictionary<string, int> {
    { "sample1", 100 },
    { "sample1", 200 },
    { "sample1", 300 }
};

それが、インデックスを使った構文でかけるようになったので、
見やすくなったという話し

投稿日時: 2025-06-26 16:00:26
更新日時: 2025-06-26 16:02:26

例えば、実行ファイルのあるディレクトリを取得したい場合に以下のように書いたとします

var directoryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

そうすると、以下のように波線が表示され、 null 参照の可能性があるものの逆参照です。 という警告がでます

つまり、Assembly.GetEntryAssenbly()がnullを返す可能性があり、nullの時に .Location するとエラーになるという話です。

こういった場合に、Null条件演算子を記載しておくと、nullだった時その先のメソッドやプロパティを 実行せずにnullを返してくれエラーの回避をしてくれます

var directoryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location);
↓
var directoryPath = Path.GetDirectoryName(null); // これと同等

※Path.GetDirectoryNameはnullを受け取った場合そのままnullを返してくれてエラーにはならないです

パスなのでnullを返されても・・・というのはあると思うので、Null合体演算子を使って空文字にしてしまうのでもよいですね

var directoryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? "";

もうちょっと極端なケースをみるとその恩恵が強く感じられるのかもしれないのでそんな例を
たとえばあるクラスのメソッドをつなげて実行できる場合に、そのメソッドがnullを返す恐れがあると
それ以降のメソッドでエラーになるのでNull合体演算子を使うことになるのですが

var ret = new Hoge();
var val = ret.Foo()?.Bar()?.Baz();

これをNull合体演算子を使わないでかくと…
以下のようになり見づらくなってしまうって話しになります

var ret = new Hoge();
var val = ret.Foo();
if(val != null)
{
    val = val.Bar();
    if (val != null)
    {
        val = val.Baz();
    }
}
投稿日時: 2025-06-14 00:48:14

変数名やメソッド、クラス名等の名前が文字列として取得できる関数

ログやエラーメッセージなどに含めておくと、それらがリファクタリングで名前を変えた場合に追従できるのがメリット

また、特定のクラスだったら処理を分岐するといったケースでも直接文字列リテラルとして指定するのではなく

nameof演算子を使っておけば、のちのち変更された場合も動的に対応することができる

こんな感じで、変数名をべた書きしていた場合に、

var data = "abc";

data += DateTime.Now.ToString("yyyy-MM-dd");

Console.WriteLine($"data={data}");

dataって変数名はいくらなんでも抽象的だから名前を変えようってことで一括変換すると


var sampleData = "abc";

sampleData += DateTime.Now.ToString("yyyy-MM-dd");

Console.WriteLine($"data={sampleData}");

リテラルで書き込んでいた変数名が取り残されてしまう

そのため、nameof演算子をつかっておけば


var data = "abc";

data += DateTime.Now.ToString("yyyy-MM-dd");

Console.WriteLine($"{nameof(data)}={data}");

リファクタリングして変数名を変更したとしても


var sampleData = "abc";

sampleData += DateTime.Now.ToString("yyyy-MM-dd");

Console.WriteLine($"{nameof(sampleData)}={sampleData}");

追従させれるので、よからぬ修正がはいらず安心ってことです

投稿日時: 2025-05-17 17:23:17
更新日時: 2025-05-19 11:56:19

最近の投稿

最近のコメント

タグ

アーカイブ

その他