C#の「var」と「dynamic」キーワードの違いを徹底解説!型チェックのタイミングと使い分けのポイント
C#では変数を宣言する際に、varとdynamicという2つのキーワードを使うことができます。どちらも明示的な型指定を省略できる点で似ていますが、型チェックが行われるタイミングが大きく異なります。本記事では、それぞれの特徴と具体的なコード例を通じて、両者の違いをわかりやすく解説します。
dynamicキーワードとは
dynamicキーワードを使って宣言した変数は、動的型付け変数と呼ばれます。この型の変数には、整数、文字列、浮動小数点数など、あらゆる型の値を格納することが可能です。
最大の特徴は、型チェックが実行時(ランタイム)に行われるという点です。そのため、コンパイル時にはエラーが検出されず、プログラム実行時に初めて型の整合性が確認されます。
dynamic型変数を宣言する構文は以下の通りです。
dynamic <変数名> = 値;
実際の宣言例を見てみましょう。
dynamic val1 = 100; dynamic val2 = 5; dynamic val3 = 20;
なお、dynamicはobject型とよく比較されます。object型の場合はコンパイル時に型チェックが行われるのに対し、dynamic型変数の場合は実行時に型チェックが行われるという点が大きな違いです。
varキーワードとは
varキーワードは、変数を初期化する際に使用されるキーワードです。代入する値からコンパイラが自動的に型を推論するため、開発者は明示的に型名を書く必要がありません。整数でも、文字列でも、float型でも、任意の値を自由に代入できます。
重要なのは、varで宣言された変数は静的型付け変数であるという点です。一度型が決まれば、その後別の型の値を代入することはできません。型チェックはコンパイル時に行われるため、型の不一致によるバグを早期に発見できます。
サンプルコード
次のコードは、varキーワードを使ってint型とstring型の変数を宣言し、値を出力する例です。
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
var myInt = 5;
var myString = "Amit";
Console.WriteLine("Rank: {0} \nName: {1}", myInt, myString);
}
}
}
出力結果
Rank: 5 Name: Amit
まとめ:varとdynamicの違い一覧
| 項目 | var | dynamic |
|---|---|---|
| 型チェックのタイミング | コンパイル時 | 実行時 |
| 型付けの種類 | 静的型付け | 動的型付け |
| 型の変更可否 | 不可(初期化時に確定) | 可能(任意の型を代入可) |
| 主な用途 | 型推論によるコード簡潔化 | COM連携やリフレクションなど柔軟な処理 |
このように、varはコンパイル時に型が確定する安全な型推論のためのキーワードであり、dynamicは実行時に型が決まる柔軟性重視のキーワードです。通常の開発では型安全性の高いvarを使用し、どうしても動的な挙動が必要な場面でのみdynamicを使うのが良い設計と言えるでしょう。
-
C#の暗黙的型変換と明示的型変換の違いを徹底解説!サンプルコードで学ぶ型変換の基本
はじめに C#では、異なるデータ型の間で値をやり取りする際に「型変換」が必要になります。型変換には、コンパイラが自動的に行ってくれる暗黙的型変換と、プログラマが意図的に指示する明示的型変換の2種類があります。本記事では、それぞれの特徴と違いをサンプルコードとともにわかりやすく解説します。 暗黙的型変換(Implicit Type Conversion)とは 暗黙的型変換は、C#が型の安全性を保ちながら自動的に実行してくれる変換です。小さい型から大きい型への変換(例:int → long)は、データが失われる恐れがないため、特別な記述をしなくても行えます。 次のコードを見てください。int型の
-
C#における型変換と型キャストの違いとは?基本からコード例まで解説
C#において、型変換と型キャストは本質的に同じものを指します。どちらも「あるデータ型の値を別のデータ型へ変換する」処理のことです。C#の型キャストには、大きく分けて次の2つの形式があります。C#の型キャストの2つの形式1. 暗黙的な型変換(Implicit Conversion)暗黙的な型変換は、C#が自動的に、かつ型安全な方法で実行する変換です。プログラマーが特別な記述をしなくても、コンパイラが適切に処理してくれます。代表的な例としては、以下のようなケースが挙げられます。小さい整数型から大きい整数型への変換(例:int型からlong型へ)派生クラスから基底クラスへの変換(アップキャスト)2.