Sdílet prostřednictvím


Použití typu dynamic (Průvodce programováním v C#)

Visual C# 2010zavádí nový typ dynamic.Typ je statického typu, ale objekt typu dynamic vynechá kontrolu statického typu.Ve většině případů funguje jako má typ object.V době kompilace, element, který je zadán jako dynamic považován za podporu jakékoli operace.Proto není nutné být obavy, zda objekt získává svou hodnotu z rozhraní API COM, z dynamických jazyků, například IronPython, z HTML Document Object Model (DOM), z reflexe nebo z jinde v programu.Nicméně pokud kód není platný, jsou zachyceny chyby za běhu.

Například pokud instanční metodu exampleMethod1 v následujícím kódu má pouze jeden parametr, kompilátor rozpozná, že první volání metody, ec.exampleMethod1(10, 4), je neplatný, protože obsahuje dva argumenty.Volání způsobí chybu kompilátoru.Druhé volání metody, dynamic_ec.exampleMethod1(10, 4), kompilátor není zaškrtnuto, protože typ dynamic_ec je dynamic.Proto je hlášena žádná chyba kompilátoru.Však chyba není escape oznámení neomezeně dlouho.To je zachycena v době běhu a způsobí výjimku běhu.

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) { }
}

Role kompilátoru v těchto příkladech je zabalit dohromady informace o každé prohlášení navrhující k objektu nebo výraz, který je zadán jako dynamic.V době běhu je zkontrolován uložené informace a jakýkoli příkaz, který není platný způsobí výjimku běhu.

Výsledek operace Většina dynamických je sám dynamic.Například, pokud umístíte ukazatel myši použití testSum v následujícím příkladu zobrazí IntelliSense typ (místní proměnná) dynamické testSum.

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

Ve kterých je výsledek operace dynamic zahrnují převody z dynamic jiný typ a volání konstruktoru, které obsahují argumenty typu dynamic.Například typ testInstance následující deklaraci je ExampleClass, nikoli dynamic.

var testInstance = new ExampleClass(d);

Převod příklady jsou uvedeny v následující části "Převod".

Převody

Převody mezi dynamické objekty a jiné typy jsou snadno.To umožňuje vývojáři přepínat mezi dynamickými a bez dynamické chování.

Každý objekt lze převést na dynamické typ implicitně, jak je znázorněno v následujících příkladech.

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

Naopak, implicitní převod lze dynamicky použít libovolný výraz typu dynamic.

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

Přetížení rozlišení s argumenty typu dynamic

Rozlišení přetížení v době běhu, nikoli v době kompilace dochází, pokud jeden nebo více argumentů ve volání metody musí mít typ dynamic, nebo pokud je typ příjemce volání metody dynamic.V následujícím příkladu Pokud přístupné pouze exampleMethod2 vzít argumentu řetězec, je definována metoda odesílání d1 jako argument nezpůsobí chybu kompilátoru, ale to způsobit výjimku běhu.Přetížení rozlišení nezdaří za běhu, protože typu run-time d1 je int, a exampleMethod2 vyžaduje řetězec.

// 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);

Dynamické běhové prostředí

Dynamic language runtime (DLR) je nové rozhraní API v .NET Framework 4.Poskytuje infrastrukturu, která podporuje dynamic typ v jazyce C# a také provádění dynamických programovacích jazyků, jako například IronPython a IronRuby.Další informace o DLR viz Přehled DLR (Dynamic Language Runtime).

Volání Interop modelu COM.

Visual C# 2010obsahuje několik funkcí, které zlepšuje spolupráci s API COM jako rozhraní API automatizace systému Office.Mezi vylepšení patří použití dynamic typu a s názvem a volitelné argumenty.

Mnoho metod modelu COM umožňují kolísání typy argumentů a označením typy jako návratový typ object.To je nezbytné explicitní přetypování hodnot koordinovat s typově proměnných v jazyce C#.Pokud kompilujete pomocí /link (Možnosti kompilátoru C#) možnost zavedení dynamic typ umožňuje považovat výskytů object v podpisech COM jako by byly typu dynamica tím zabránit mnohem odlitku.Následující příkazy například kontrast, jak přistupovat k buňce v tabulce aplikace Microsoft Office Excel s dynamic typu, aniž 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];

Příbuzná témata

Title

Description

dynamic (Referenční dokumentace jazyka C#)

Popisuje použití dynamic klíčové slovo.

Přehled DLR (Dynamic Language Runtime)

Přehled DLR je běhové prostředí, který přidává sadu služeb pro dynamické jazyky common language runtime (CLR).

Postupy: Vytváření a používání dynamických objektů (C# a Visual Basic)

Obsahuje podrobné pokyny pro vytvoření vlastní dynamický objekt a pro vytvoření projektu, který přistupuje IronPython knihovny.

Postupy: Přístup k objektům Interop sady Office pomocí funkcí Visual C# (Průvodce programováním v C#)

Ukazuje, jak vytvořit projekt, který používá pojmenované a volitelné argumenty dynamic typ a další vylepšení, které usnadňují přístup k objektům rozhraní API systému Office.