0Pricing
C# Academy · レッスン

dynamic型

dynamicを使って型の解決を実行時まで遅延させます。

「dynamic型」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

dynamic とは

dynamic 型は、コンパイル時の型チェックを回避します。メンバーへのアクセスや演算は、代わりに実行時に解決されます。

using System;

class Program {
    static void Main() {
        dynamic value = 10;
        Console.WriteLine(value + 5);
    }
}

異なる型の再代入

dynamic 変数には任意の型を格納でき、代入するたびに型を変更することもできます。

using System;

class Program {
    static void Main() {
        dynamic x = 1;
        Console.WriteLine(x);
        x = "now a string";
        Console.WriteLine(x);
    }
}

実行時バインディング

dynamic では、コンパイラはコードを信頼します。メソッドやプロパティの検索はコンパイル時ではなく、その行の実行時に行われます。

using System;

class Program {
    static void Main() {
        dynamic text = "hello";
        Console.WriteLine(text.ToUpper());
    }
}

エラーは実行時に発生する

チェックが遅延されるため、存在しないメンバーを使うとコンパイルに失敗するのではなく、実行時に RuntimeBinderException がスローされます。

using System;
using Microsoft.CSharp.RuntimeBinder;

class Program {
    static void Main() {
        dynamic n = 5;
        try {
            n.NoSuchMethod();
        } catch (RuntimeBinderException) {
            Console.WriteLine("No such member");
        }
    }
}

dynamic と var

var はコンパイル時に型が固定されますが、dynamic は実行時に柔軟に扱われます。見た目は似ていますが、動作は大きく異なります。

using System;

class Program {
    static void Main() {
        var fixedType = 10;
        dynamic flexible = 10;
        flexible = "changed";
        Console.WriteLine(fixedType + " " + flexible);
    }
}

dynamic に対する算術演算

dynamic に対する演算子は、関係する実際の値に基づいて実行時に解決されます。

using System;

class Program {
    static void Main() {
        dynamic a = 3;
        dynamic b = 4;
        Console.WriteLine(a * b);
    }
}

dynamic の戻り値

型が実際に変化する場合、メソッドは dynamic を返すことができます。ただし、呼び出し側ではコンパイル時の支援が失われます。

using System;

class Program {
    static dynamic GetValue(bool flag) {
        return flag ? (dynamic)42 : "text";
    }
    static void Main() {
        Console.WriteLine(GetValue(true));
        Console.WriteLine(GetValue(false));
    }
}

dynamic の使用例

dynamic は、COM 相互運用、JSON のようなデータ、実行時まで形状が分からないコードの呼び出しに役立ちます。

using System;

class Program {
    static void Main() {
        dynamic data = 100;
        data += 1;
        Console.WriteLine(data);
    }
}

パフォーマンスへのコスト

実行時バインディングにはオーバーヘッドがあります。タイトなループや単純なコードでは、速度と安全性のために静的型を優先します。

using System;

class Program {
    static void Main() {
        int fast = 0;
        for (int i = 0; i < 5; i++) fast += i;
        Console.WriteLine(fast);
    }
}

IntelliSense が使えない

型が実行時まで分からないため、エディターは dynamic のメンバーを候補として表示できません。これにより開発速度が低下します。

using System;

class Program {
    static void Main() {
        dynamic s = "Code";
        Console.WriteLine(s.Length);
    }
}

使用は控えめに

静的型付けでは本当に表現できない状況でのみ dynamic を使い、それ以外では具象型を優先します。

using System;

class Program {
    static void Main() {
        dynamic flexible = 7;
        Console.WriteLine(flexible.GetType().Name);
    }
}

理解度チェック

dynamic の理解度を確認しましょう。

まとめ

dynamic はコンパイル時の型チェックを無効にし、実行時にメンバーを解決します。そのため、dynamic 変数は型を変更でき、無効な呼び出しでは RuntimeBinderException がスローされます。

コンパイル時に型が固定される var とは異なり、dynamic は柔軟ですが、パフォーマンスが低下し、IntelliSense も使えません。使用は控えめにしてください。

よくある質問

「dynamic型」レッスンは無料ですか?

はい。「dynamic型」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「dynamic型」で何を学びますか?

dynamicを使って型の解決を実行時まで遅延させます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「dynamic型」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. varによるローカル変数の型推論
  2. varを避けるべき場面
  3. dynamic型
  4. ターゲット型指定されたnew式
← C# Academyに戻る