C# PR

【C#】is演算子で型変換チェック

アイキャッチ(c_sharp)
記事内に商品プロモーションを含む場合があります

こんにちは!
なかむぅです。

C#のコードを読んでいると毎回のように

is ってなに

となるので、定着させるためにまとめます。

is演算子は型に変換できるかどうかの演算子

is演算子は型を変換できるかどうかの演算子です。

ある型を別の型に変換できるかどうか調べたいときに使います。

is演算子の使い方

is演算子は左に調べたい変数、右側に変換したい型を書きましょう。


child is Parent

変換できる場合はtrue、変換できない場合はfalseのbool値が返還されます。

例えば、以下のような親クラスを継承した子クラスが2つ、子クラスのうち1つを継承した孫クラスが1つあるとしましょう。


class Parent {}
class Child1 : Parent {}
class Child2 : Parent {}
class GrandChild : Child1 {}

それぞれをis演算子で以下のチェックするとします。

  • 子1は親に変換できるか
  • 親は子1に変換できるか
  • 子1は子2に変換できるか
  • 孫は親に変換できるか

class Program
{
	static void Main(string[] args)
	{
		var parent = new Parent();
		var child1 = new Child1();
		var child2 = new Child2();
		var grandChild = new GrandChild();

		Console.WriteLine(child1 is Parent);
		Console.WriteLine(parent is Child1);
		Console.WriteLine(child1 is Child2);
		Console.WriteLine(grandChild is Parent);
	}
}

結果は以下のようになりました。

結果

Child1 is Parent : True
Parent is Child1 : False
Child1 is Child2 : False
GrandChild is Parent : True
引数で渡ってきたときはどうなるんや

と思ったので試してみましたが、is演算子は引数で渡ってきた時にもしっかりとチェックしてくれます。


class Program
{
	class Parent {}
	class Child1 : Parent {}
	class Child2 : Parent {}
	class GrandChild : Child1 {}
	static void Main(string[] args)
	{
		var child1 = new Child1();
		var child2 = new Child2();
		var grandChild = new GrandChild();

		CheckType(child1);
		CheckType(child2);
		CheckType(grandChild);
	}

	private static void CheckType(Parent type)
	{
		if (type is Child1)
		{
			Console.WriteLine($"Type is Child1");
		}
		if (type is Child2)
		{
			Console.WriteLine($"Type is Child2");
		}
		if (type is GrandChild)
		{
			Console.WriteLine($"Type is GrandChild");
		}
	}
}
結果

Type is Child1
Type is Child2
Type is Child1
Type is GrandChild

C#7.0からはis演算子を使って同時にキャスト可能

C# 7.0以前は、is演算子でキャスト可能かを判定してからキャストを行っていました。


if (child is Parent)
{
	// is演算子でtrueならキャストする
	var parent = (Parent)child;
	parent.Age = "33";
}
else
{
	//キャストできなかったときの処理
}

しかし、C#7.0からはis演算子を使って同時にキャストできるようになっています。

キャスト可能か調べたい型に変数を付け加えると、その変数の中にキャストされたオブジェクトを同時に入れてくれるので、記述も減るしスッキリもするし便利。


if (child is Parent parent)
{
	// 型と変数を一緒に入れるとif文の中でついでにキャストされる
	parent.Age = "33";
}
else
{
	//キャストできなかったときの処理
}


私の会社で一緒に働きませんか?

私が働く会社では、一緒に働いてくれるエンジニアを募集しています♪

こんな人がオススメ
  • 長く働いていても年収が全然上がらない…一気に年収を上げたい
  • 残業をしたくてしているわけではないので、残業代はしっかりと出して欲しい
  • やりたいことに挑戦させてもらえない…自分がしてみたいことに挑戦したい
  • 通勤時間が長すぎるから、できるだけ短くしたい
  • もっと勉強したいから、書籍代や資格の受験料など負担してくれるところに入りたい
  • 現場に駆り出されてからは放置プレイ…相談できる人も先輩も居ないので、自分の状況をちゃんと理解してくれるところで働きたい

上記内容に1つでも当てはまる場合は、ぜひお声がけください。
私のサイトから応募していただいた方にはお好きなギフト券5000円分プレゼントさせていただきます(条件あり)。

詳細ページ


まとめ

isは型が変換できるかチェックできる演算子でした。

さらに、C#7.0からは同時にキャストできるようになっているので記述がスッキリしますね。

以上、 is演算子についてでした!

いやここは違うだろ

と思った方はコメントいただけると嬉しいです。

最後までお読みいただきありがとうございました!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です