Udostępnij za pośrednictwem


Przy użyciu typu dynamiczne (C# Programming Guide)

Visual C# 2010wprowadzono nowy typ, dynamic.Typ jest typu statycznego, ale obiektu typu dynamic pomija sprawdzanie typu statycznego.W większości przypadków, funkcje, jak to ma typ object.W czasie kompilacji, element, który jest wpisana jako dynamic przyjęto, że do obsługi żadnych operacji.W związku z tym nie trzeba obawiać się o czy obiekt pobiera wartości z API modelu COM, od dynamicznego języka, takich jak Boo, z HTML Document Object Model (DOM), z odbiciem lub z innego programu.Jednakże ten kod nie jest prawidłowy, złowionych błędy w czasie wykonywania.

Na przykład jeśli wystąpienie metody exampleMethod1 w następującym kodzie ma tylko jeden parametr, kompilator uznaje, że pierwsze wywołanie metody, ec.exampleMethod1(10, 4), jest nieprawidłowa, ponieważ zawiera on dwa argumenty.Wywołanie powoduje błąd kompilatora.Drugie wywołanie metody, dynamic_ec.exampleMethod1(10, 4), nie jest sprawdzane przez kompilator, ponieważ typ dynamic_ec jest dynamic.Błąd kompilatora nie jest zgłaszane.Jednak błąd nie uciec zawiadomienia przez czas nieokreślony.To jest złowionych w czasie wykonywania i powoduje wyjątek czasu.

static void Main(string[] args)
{
    ExampleClass ec = new ExampleClass();
    // The following call to exampleMethod1 causes a compiler error 
    // if exampleMethod1 has only one parameter. Uncomment the line
    // to see the error.
    //ec.exampleMethod1(10, 4);

    dynamic dynamic_ec = new ExampleClass();
    // The following line is not identified as an error by the
    // compiler, but it causes a run-time exception.
    dynamic_ec.exampleMethod1(10, 4);

    // The following calls also do not cause compiler errors, whether 
    // appropriate methods exist or not.
    dynamic_ec.someMethod("some argument", 7, null);
    dynamic_ec.nonexistentMethod();
}
class ExampleClass
{
    public ExampleClass() { }
    public ExampleClass(int v) { }

    public void exampleMethod1(int i) { }

    public void exampleMethod2(string str) { }
}

Rola kompilatora w tych przykładach jest pakiet ze sobą informacje o każdej instrukcji proponuje zrobić do obiektu lub wyrażenie, które jest wpisana jako dynamic.W czasie wykonywania przechowywanych informacji jest badane, a wszelkie instrukcja, która nie jest prawidłowy powoduje wyjątek czasu.

Wynik operacji najbardziej dynamicznych jest sam dynamic.Na przykład, jeśli wskaźnik myszy nad wykorzystaniem testSum w następującym przykładzie, IntelliSense wyświetla typ testSum dynamiczne (zmienna lokalna).

dynamic d = 1;
var testSum = d + 3;
// Rest the mouse pointer over testSum in the following statement.
System.Console.WriteLine(testSum);

Operacje, w których wynik nie jest dynamic obejmują konwersje z dynamic do innego typu i wywołania konstruktora, które obejmują argumenty typu dynamic.Na przykład, typ testInstance w następującej deklaracji jest ExampleClass, nie dynamic.

var testInstance = new ExampleClass(d);

Przykłady konwersji są przedstawione w poniższej sekcji "Konwersje".

Konwersje

Podczas konwersji między obiekty dynamiczne i inne typy są łatwe.Dzięki temu deweloper przełączać się między zachowanie dynamicznych i statycznych.

Dowolny obiekt można przekonwertować typu dynamicznego niejawnie, jak pokazano w poniższych przykładach.

dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();

Odwrotnie, niejawna konwersja można dynamicznie stosować do dowolnego wyrażenia typu dynamic.

int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;

Przeciążenia z argumentami typu dynamicznego

Rozdzielczość przeciążenie występuje w czasie wykonywania, a nie w czasie kompilacji, jeśli jeden lub więcej argumentów wywołania metody typu, dynamic, lub jeśli odbiorcą wywołania metody jest typu dynamic.W poniższym przykładzie jeśli tylko dostępne exampleMethod2 metoda jest zdefiniowana do podjęcia z argumentu ciąg, wysłanie d1 jako argument nie spowoduje błąd kompilatora, ale powoduje wyjątek czasu.Przeciążenie rozdzielczości nie działa w czasie wykonywania, ponieważ typu run-time d1 jest int, i exampleMethod2 wymaga ciąg.

// Valid.
ec.exampleMethod2("a string");

// The following statement does not cause a compiler error, even though ec is not
// dynamic. A run-time exception is raised because the run-time type of d1 is int.
ec.exampleMethod2(d1);
// The following statement does cause a compiler error.
//ec.exampleMethod2(7);

Aparat plików wykonywalnych języka dynamicznego

Aparat plików wykonywalnych języka dynamicznego (DLR) jest nowy interfejs API w .NET Framework 4.Zapewnia infrastrukturę, która obsługuje dynamic typu w C#, a także realizacji dynamicznych języków programowania, takich jak Boo i IronRuby.Aby uzyskać więcej informacji na temat DLR, zobacz Omówienie środowiska wykonawczego języka dynamicznego.

Współdziałania z modelem COM.

Visual C# 2010zawiera kilka funkcji, które poprawy wydajności współdziałanie z interfejsów COM API, takie jak interfejsy API automatyzacji pakietu Office.Wśród usprawnień są: Korzystanie z dynamic typu i z Argumenty nazwane i opcjonalnie.

Wiele metod COM pozwalają na zmianę w typy argumentów i zwracany typ poprzez wyznaczenie typów jako object.Jest to wymuszone jawne rzutowania wartości do koordynowania z wpisaną zmiennych w C#.Jeśli skompilować przy użyciu /Link (C# kompilator opcje) opcję wprowadzenia dynamic typu pozwala traktować wystąpień object w podpisach COM tak, jakby były typu dynamici tym samym uniknąć wiele odlewania.Na przykład, poniższe instrukcje kontrastu, jak uzyskać dostęp do komórki w arkuszu kalkulacyjnym programu Microsoft Office Excel z dynamic typu i bez dynamic typu.

// Before the introduction of dynamic.
((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name";
Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1];
// After the introduction of dynamic, the access to the Value property and
// the conversion to Excel.Range are handled by the run-time COM binder.
excelApp.Cells[1, 1].Value = "Name";
Excel.Range range2010 = excelApp.Cells[1, 1];

Tematy pokrewne

Tytuł

Opis

dynamiczne (C# odniesienia)

W tym artykule opisano sposób użycia z dynamic słowa kluczowego.

Omówienie środowiska wykonawczego języka dynamicznego

Zawiera omówienie DLR, który jest środowisko, które dodaje zestaw usług dla dynamicznych języków common language runtime (CLR).

Wskazówki: Tworzenie obiektów dynamicznych i posługiwanie się nimi (C# i Visual Basic)

Instrukcje krok po kroku dotyczące tworzenia niestandardowych obiektów dynamicznych i do tworzenia projektu, który uzyskuje dostęp do IronPython biblioteki.

Jak: współdziałania obiektów programu Access Office dzięki funkcjom Visual C# 2010 (C# Programming Guide)

Pokazuje, jak utworzyć projekt, który korzysta z nazwanych i opcjonalne argumenty, dynamic typ i inne rozszerzenia, które ułatwiają dostęp do obiektów interfejsu API pakietu Office.