English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tipo dinamico di C# (Dynamic)

C#4.0 (NET 4.5) ha introdotto un nuovo tipo chiamato dynamic, che evita la verifica del tipo alla compilazione. Il tipo dynamic salta la verifica del tipo alla compilazione; al contrario, si risolve il tipo durante l'esecuzione.

Le variabili di tipo dinamico sono definite utilizzando la parola chiave dynamic.

dynamic MyDynamicVar = 1;

In molti casi, il compilatore compila i tipi dinamici come tipo oggetto. Ma il tipo effettivo della variabile dinamica viene risolto in esecuzione.

dynamic MyDynamicVar = 1;
Console.WriteLine(MyDynamicVar.GetType());
Output:

System.Int32

I tipi dinamici cambiano il loro tipo in esecuzione in base al valore assegnato. Ecco un esempio che mostra come le variabili dinamiche cambiano il loro tipo in base al valore assegnato.

static void Main(string[] args)
{
    dynamic MyDynamicVar = 100;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = "Hello World!!";
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = true;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = DateTime.Now;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
}
Output:
Valore: 100, tipo: System.Int32
Valore: Hello World !!, tipo: System.String
Valore: True, tipo: System.Boolean
Valore: 01-01-2014, tipo: System.DateTime

Le variabili di tipo dinamico si convertono implicitamente in altri tipi.

dynamic d1 = 100;
int i = d1;
d1 = "Hello";
string greet = d1;
d1 = DateTime.Now;
DateTime dt = d1;

Metodi e parametri

Se si assegna un oggetto di classe a un tipo dinamico, il compilatore non verifica i metodi e le proprietà corretti del tipo dinamico per salvare oggetti di classe personalizzati. Ecco un esempio.

class Program
{
    static void Main(string[] args)
    {
        dynamic stud = new Student();
        stud.DisplayStudentInfo(1, "Bill"); Erro in esecuzione, nessun errore a compilazione
        stud.DisplayStudentInfo("1"); Erro in esecuzione, nessun errore a compilazione
        stud.FakeMethod(); Erro in esecuzione, nessun errore a compilazione
    }
}
public class Student
{
    public void DisplayStudentInfo(int id)
    {
    }
}

Nel esempio sopra, il compilatore di C# non verifica i parametri, il tipo dei parametri o se essi esistono. Verifica questi contenuti durante l'esecuzione e, se non validi, lancia un'eccezione di runtime. Si prega di notare che i tipi dinamici non sono supportati da Visual Studio IntelliSense. Si prega di notare che i tipi dinamici non sono supportati da Visual Studio IntelliSense.

L'API del runtime linguistico dinamico (DLR) fornisce la struttura di base per i tipi dinamici in C#.