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

Tipos Dinâmicos do C# (Dynamic)

C#4.0 (.NET 4.5O ) introduziu um novo tipo chamado dynamic, que evita a verificação de tipo no tempo de compilação. O tipo dinâmico pula a verificação de tipo no tempo de compilação; em vez disso, ele resolve o tipo no tempo de execução.

As variáveis de tipo dinâmico são definidas usando a palavra-chave dynamic.

dynamic MyDynamicVar = 1;

Em muitos casos, o compilador compila o tipo dinâmico para o tipo de objeto. No entanto, o tipo real da variável dinâmica será resolvido no tempo de execução.

dynamic MyDynamicVar = 1;
Console.WriteLine(MyDynamicVar.GetType());
saída:

System.Int32

Os tipos dinâmicos mudam de tipo no tempo de execução com base no valor atribuído. O exemplo a seguir mostra como a variável dinâmica muda de tipo com base no valor atribuído.

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

As variáveis de tipo dinâmico são implicitamente convertidas para outros tipos.

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

Métodos e parâmetros

Se o objeto da classe for alocado para um tipo dinâmico, o compilador não verificará os métodos e atributos corretos do tipo dinâmico que armazenam objetos de classe personalizados. Veja o exemplo a seguir.

class Program
{
    static void Main(string[] args)
    {
        dynamic stud = new Student();
        stud.DisplayStudentInfo(1, "Bill");// Erro de execução, não há erro de compilação
        stud.DisplayStudentInfo("1");// Erro de execução, não há erro de compilação
        stud.FakeMethod();// Erro de execução, não há erro de compilação
    }
}
public class Student
{
    public void DisplayStudentInfo(int id)
    {
    }
}

No exemplo acima, o compilador do C# não verifica os parâmetros, o tipo dos parâmetros ou se eles existem. Ele verifica isso no tempo de execução e, se inválido, lança uma exceção de tempo de execução. Observe que os tipos dinâmicos não são compatíveis com o IntelliSense do Visual Studio. Observe que os tipos dinâmicos não são compatíveis com o IntelliSense do Visual Studio.

A API do Tempo de Execução de Linguagem Dinâmica (DLR) fornece a infraestrutura básica para tipos dinâmicos no C#.