2008-10-28 8 views
6

peut les variables dynamiques en C# 4.0 être membres d'une classe ou passé dans ou retour de méthodes? var de C# 3.0 ne pouvait pas mais je n'ai vu aucune mention nulle part de savoir si c'est possible ou non avec dynamique.Nouvelle variable dynamique C# 4.0

Répondre

6

Oui. Il y a une grande différence entre var et dynamic.

var signifie simplement « laisser le compilateur déduire le type réel de la variable ».

dynamicest le type de la variable - donc où vous pouvez spécifier un type, vous pouvez spécifier dynamic à la place, si je comprends bien. (Je suis sûr qu'il ya des exceptions, mais c'est l'idée de base.)

EDIT: Chris Burrow first blog entry on dynamic (il y a un second one déjà, attendez plus tôt) donne une classe exemple qui utilise dynamic partout.

+0

En fait, dynamique n'est pas vraiment le type. Il dit plus simplement, ne détermine pas le type réel jusqu'à l'exécution. Vous pouvez utiliser "est" sur les types dynamiques et comprendre ce qu'ils sont vraiment. –

+2

Mais dynamic est le type de la variable * still, de la même manière que si vous déclarez "object x = new MemoryStream()" alors le type de la variable est "object" alors que le type de l'objet est la valeur de la variable est "MemoryStream". –

+0

J'essaie de trouver l'endroit où j'ai lu MS qui a expliqué ce que j'essayais d'expliquer. Je ne peux pas le trouver à nouveau. J'ai lu trop d'informations de PDC ces deux derniers jours. –

2

Cet extrait de code du livre "CLR via C#, 3ème Ed" montre dynamique en action:

using System; 
using System.Dynamic; 
static class DyanmicDemo 
{ 
    public static void Main() { 
    for(Int32 demo =0; demo < 2; demo++) { 
    dynamic arg = (demo == 0) ? (dynamic) 5 : (dynamic) "A"; 
    dynamic result = Plus(arg); 
    M(result); 
    } 
} 
    private static dynamic Plus(dynamic arg) { return arg + arg; } 
    private static void M(Int32 n) { Console.WriteLine("M(Int32): " + n); } 
    private static void M(String s) { Console.WriteLine("M(String): " + s); } 
} 

Quand j'exécute Main, je reçois la sortie suivante:

M (Int32): M (Chaîne): AA