8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C#】null免除演算子(ビックリマーク)で警告を無視する

Last updated at Posted at 2021-12-10

#概要
業務でC#を触っていたら、たまたま変数に!をつける方法を見つけたが、調べてみてもなかなかヒットせず…
なんと、通常の検索エンジンでは!という記号は調べられないとのこと!知らなかった!

ということで、C#8.0で登場したnull免除演算子について紹介したいと思います!
本記事は、C#リファレンスの内容を簡単にまとめたものになりますので、詳しく知りたい方は下記リンクへどうぞ

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-forgiving

#null免除演算子(!)とは
変数xにnull免除演算子(!)をつけると、xはnullでないことを保証するといった意味になります。
例えば、Resharperなどのコードフォーマッタがエディタ上で警告を出している場合、null免除演算子を用いることで警告を生成しないようにすることができます。

これを用いることで、例外処理の記述を省略することができ、コードの量を削減することができます。
一方で、例外処理の記述が省いてしまうため、多用してしまうとデバッグが困難になる可能性があります。

具体例とともに見ていきましょう。

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    internal class Program
    {
        public static List<Person> PersonList = new()
        {
            new Person { Name = "桜井" },
            new Person { Name = "坂崎" },
            new Person { Name = "高見沢" },
        };

        private static void Main()
        {
            var person = PersonList.FirstOrDefault(p => p.Name == "高見沢");
            Console.WriteLine(person.Name);
        }
    }

    internal class Person
    {
        public string Name;
    }
}

このようなコードがあったとき、Resharperなどのコードフォーマッタを使用していると、画像のような警告文が表示されます。
warning.png
この警告文を出さないようにする方法として、「変数がnullの場合は例外を投げるようにする」といった方法があります。
しかし、これを複数重ねてしまうとコードの量がどんどん増えてしまいます。

Program.cs
        // 警告文を出さないために、nullの場合例外を投げる
        private static void Main()
        {
            var person = PersonList.FirstOrDefault(p => p.Name == "高見沢");
            if (person == null)
            {
                throw new KeyNotFoundException();
            }
            Console.WriteLine(person.Name);
        }

そこで、null免除演算子を用いて、コードの量を抑えつつ警告文をでないようにすることができます。

Program.cs
        // null免除演算子(!)をつけると、警告文が出なくなる
        private static void Main()
        {
            var person = PersonList.FirstOrDefault(p => p.Name == "高見沢");
            Console.WriteLine(person!.Name);
        }

#まとめ
総合的にみるとnull演算子によるメリットに対して、デメリットの方が多いように感じます。
そのため、確実にnullでないことを保証できる場合のみに限定するのがよいかもしれません…

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?