簡體   English   中英

為什么C#動態類型是靜態的?

[英]Why is C# dynamic type static?

在閱讀和探索我在[MSDN]上的以下行中找到的動態關鍵字時(在使用類型動態(C#編程指南)中 ):

類型是靜態類型,但動態類型的對象繞過靜態類型檢查。 在大多數情況下,它的功能類似於它具有類型對象。

靜態在上面的行是什么意思,它如何繞過靜態類型檢查?

這是靜態類型:

string foo = "bar";

foo現在是一個字符串,因此這將導致編譯時錯誤:

foo = 1;

即使你使用var ,它仍然是靜態類型的:

var foo = "bar";     // foo is now a string
foo = 1;             // still a compile time error

使用dynamic關鍵字意味着類型不是靜態的並且可以更改,所以現在你可以這樣做:

dynamic foo = "bar";   
foo = 1;              // this is now fine.

現在,為什么它說“類型是靜態類型”是因為在許多動態語言(如Javascript)中,你可以這樣做:

var foo = { bar: 1 };

這會創建一個名為“bar”的對象,然后你可以這樣做:

foo.la = 2;

這為foo的對象添加了一個新屬性。 但是如果你在C#中嘗試相同的技巧

dynamic foo = new SomeClassThatDoesntHaveABarProperty();
foo.bar = 2;          // runtime error

你也不能刪除一個屬性。 您可以將任何類型分配給動態變量,但不能自行更改這些類型。

如果您確實需要這種類型的功能,那么您將需要查看ExpandoObject

正如您的描述所說, dynamic函數在很多情況下都像對象一樣。 你可以這樣做:

dynamic foo = new Foo();
foo = new Bar();

就像這樣:

object foo = new Foo();
foo = new Bar();

但是,當您想要使用屬性或方法時,會出現差異。 有了動態,我可以這樣做:

dynamic foo = new Foo();
foo.FooMethod();          // Note: You WILL get a runtime exception if foo doesn't have a FooMethod

但是有了一個對象,我需要這樣做:

object foo = new Foo();
((Foo)foo).FooMethod();    // Note: I HAVE to know the type at compile time here

我只能知道我可以在編譯時將 foo中的類型轉換為類型的Foo ,如果我已經知道了,那么我可以使用Foo作為我的類型而不是object

這意味着聲明為動態的變量將保持動態類型,並且不能更改為int類型的變量。 但是,這個概念被繞過,因為您可以更改變量所包含的對象類型。

C#被認為是強類型語言,因為變量是靜態類型的。 這意味着每個變量都是類型化的,C#編譯器可以檢查代碼中是否使用了正確的類型。 在像大多數腳本語言這樣的弱類型語言中,變量的類型是動態的。 他們可以保持任何價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM