Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在c#中使用动态类型?_C#_.net_.net 4.0_C# 4.0 - Fatal编程技术网

为什么在c#中使用动态类型?

为什么在c#中使用动态类型?,c#,.net,.net-4.0,c#-4.0,C#,.net,.net 4.0,C# 4.0,起初我的想法是: var aName=getAllSomethings(); 非常不可读,因此我将在没有混淆空间的情况下使用动态键入,例如: AClassName aName = new AClassName(); 这里, var aName=new AClassName(); 看起来可读。 但是我读到()动态类型在性能上也是有代价的。 我试着阅读该链接中的所有其他帖子,以了解我应该在哪里使用动态键入,但却找不到一个好的理由。我是否应该等待我告诉自己“这只能通过动态键入来解决”?或者使用它

起初我的想法是:

var aName=getAllSomethings();
非常不可读,因此我将在没有混淆空间的情况下使用动态键入,例如:

AClassName aName = new AClassName();
这里,

var aName=new AClassName();
看起来可读。 但是我读到()动态类型在性能上也是有代价的。
我试着阅读该链接中的所有其他帖子,以了解我应该在哪里使用动态键入,但却找不到一个好的理由。我是否应该等待我告诉自己“这只能通过动态键入来解决”?或者使用它有更好的(实际的)理由吗?

谢谢


编辑:我的错误(-:将尽快关闭此问题。

var
不是动态类型。只是编译器推断了
aName
的类型

您的示例仍然是完全静态类型的,并且没有性能损失。您的代码被编译成与显式类型名完全相同的IL

现在在C#4中,动态类型确实存在,但它可以写成:

dynamic aName = new AClassName();

我个人的看法是,动态类型在C#4中相对很少有用-基本上是在处理仅动态已知的数据时,例如反射或导航XML。

使用
var
关键字不是动态类型。
var
关键字由编译器处理。变量是静态的基于对变量的第一次赋值的类型化

类型:

 var value = new StringBuilder();
是StringBuilder。无法更改该类型(这是动态类型所允许的)


Jon Skeet在他的博客中提到的是
dynamic
关键字。这是一个完全不同的野兽。

这不是动态类型。声明在编译时已知的静态类型,它将完全等同于声明类型名。编译器将推断类型并在生成的程序集中替换它。

不是动态类型。动态类型是通过“动态”类型进行的(很奇怪)。使用var完全没有开销,它是一种编码速记,仍然可以生成强类型变量。

您误解了动态类型的原因

“var”使用类型推断在编译时推断变量的类型。它的机制非常严格,并且绝对不会影响性能。使用“var”声明的变量仍然只能是一个确切的类型(或该类型的派生)


动态变量允许一个变量在运行时保存任何类型,并且仍然对该对象执行操作,就好像我们知道它支持什么一样。每个调用都会让运行时执行一次检查,以查看是否确实支持该方法调用。这就是为什么动态类型会有运行时开销的部分原因。

正如大家所提到的“var”关键字不提供动态类型。该类型是在编译时推断的

当我认为有意义时,我使用var;也就是说,当类型是明显的并且它减少了声明的冗长性时:

var someDict = new Dictionary<string, int>();

我不会使用'var',因为,正如您已经注意到的,您必须检查'getAllSomethings()'的返回类型(C的命名风格不好,顺便说一句),以了解'aName'是什么,这只会降低代码的可读性。

但想想您学到了多少!)@Robaticus:+1。这就是为什么我固执地宣称,唯一愚蠢的问题是那些没有被问到的问题,导致人们无法学习。这个问题有助于消除一个我认为很常见的误解,所以它肯定是有目的的。不需要结束它,我认为这是一个相当常见的问题。其他人仍然可以从这些信息中受益。@你们:谢谢你们的支持(-:我确实学到了很多(:是的,可能是重复的,但是-我之前已经论证过-这里错误的是函数名,而不是
var
。如果
var
让某些东西不那么可读,那不是
var
的错,是你为方法和变量选择的名称错误。我不同意。你真的把retu每个方法的rn类型以方法本身的名称命名,即“GetMemberIDListin”?这是他们在《XXX语言101简介》中教的胡说八道,好的方法命名不需要这种东西。不过,在本例中您是对的;在OP的示例中,方法(和变量)名称很糟糕。不,我不会将其命名为“GetMemberIdListInt”,但我可以称之为“GetMemberID”。当然,你不会马上知道它是一个列表,但我将对它执行的大多数操作都不关心它。我可以从名称中假设有某种ID,并且它是可枚举的。@Ed Swangren-正如Chris所说,我通常真的不关心方法的返回类型。我对
var
的完整意见可以在这里找到:
Dictionary<string, int>() someDict = new Dictionary<string, int>();
var aName=getAllSomethings();