C# 动态与强类型元素

C# 动态与强类型元素,c#,asp.net-mvc-3,umbraco,C#,Asp.net Mvc 3,Umbraco,我是一名web开发人员,目前正在使用mvc3 razor并创建web应用程序。我从事这项工作的时间不长,已经从使用动态元素过渡到使用强类型元素,以遵循标准 我从来没有得到过太多的理由,在网上搜索似乎很清楚,跟踪和调试集合类型变量要容易得多,但我对在函数中使用它感到困惑 例如,在使用Umbraco内容时,我现在切换到1Umbraco.TypedContent1。我猜它会返回一个强类型变量,但除了调试之外,它还有其他好处吗?我主要来自PHP和Python背景,但大约3年前就换成了C。转换到C#等强类

我是一名web开发人员,目前正在使用mvc3 razor并创建web应用程序。我从事这项工作的时间不长,已经从使用动态元素过渡到使用强类型元素,以遵循标准

我从来没有得到过太多的理由,在网上搜索似乎很清楚,跟踪和调试集合类型变量要容易得多,但我对在函数中使用它感到困惑


例如,在使用Umbraco内容时,我现在切换到1Umbraco.TypedContent1。我猜它会返回一个强类型变量,但除了调试之外,它还有其他好处吗?

我主要来自PHP和Python背景,但大约3年前就换成了C。转换到C#等强类型语言的初级开发是一个公认的学习曲线。有时,它会感觉到过度的限制,尤其是与C#非常严格的继承相结合时。然而,强类型语言可以为您带来很多东西

首先,可能最重要的是编译时错误。对于像Python这样的动态语言,在应用程序运行并且出现运行时异常之前,没有迹象表明您使用了错误的类型。使用强类型语言,应用程序甚至不会生成,因此通常不会在代码中出现定时炸弹

其次,强类型语言可以得到高度优化。通过确保每件事始终是特定类型,编译器可以优化内存分配和实际编译的汇编代码

第三,强类型语言鼓励良好的编程实践。虽然强类型语言会感到有些限制,但它会强制您的代码使用动态语言中经常缺少的结构。当然,这并不是说用动态语言编写好的代码是不可能的,但这确实意味着当开发人员不愿意花时间或精力关注他们应该关注的细节时,动态语言可能比强类型语言造成的损害要大得多

也就是说,C#并不都是强类型的。也就是说,有一个有点讨厌的
dynamic
关键字,它经常被滥用,MVC几乎鼓励在
ViewBag
之类的东西上使用dynamics。虽然
dynamic
可以占有一席之地,但我建议尽量避免使用它,因为使用强类型语言的好处基本上都被丢掉了


还有泛型的概念。您可能在没有意识到的情况下使用泛型,但是如果您在编程中感觉到过度受限,您可能应该更多地研究它们,并学习如何真正利用它们带来的功能。这有点像拥有一个动态类型,但它仍然是在编译时设置的,所以您不会失去它带来的任何好处。

我主要来自PHP和Python背景,但大约3年前切换到了C。转换到C#等强类型语言的初级开发是一个公认的学习曲线。有时,它会感觉到过度的限制,尤其是与C#非常严格的继承相结合时。然而,强类型语言可以为您带来很多东西

首先,可能最重要的是编译时错误。对于像Python这样的动态语言,在应用程序运行并且出现运行时异常之前,没有迹象表明您使用了错误的类型。使用强类型语言,应用程序甚至不会生成,因此通常不会在代码中出现定时炸弹

其次,强类型语言可以得到高度优化。通过确保每件事始终是特定类型,编译器可以优化内存分配和实际编译的汇编代码

第三,强类型语言鼓励良好的编程实践。虽然强类型语言会感到有些限制,但它会强制您的代码使用动态语言中经常缺少的结构。当然,这并不是说用动态语言编写好的代码是不可能的,但这确实意味着当开发人员不愿意花时间或精力关注他们应该关注的细节时,动态语言可能比强类型语言造成的损害要大得多

也就是说,C#并不都是强类型的。也就是说,有一个有点讨厌的
dynamic
关键字,它经常被滥用,MVC几乎鼓励在
ViewBag
之类的东西上使用dynamics。虽然
dynamic
可以占有一席之地,但我建议尽量避免使用它,因为使用强类型语言的好处基本上都被丢掉了


还有泛型的概念。您可能在没有意识到的情况下使用泛型,但是如果您在编程中感觉到过度受限,您可能应该更多地研究它们,并学习如何真正利用它们带来的功能。这有点像有一个动态类型,但它仍然是在编译时设置的,所以你们不会失去它带来的任何好处。

除了Chris提到的东西,还有一个性能优势,因为Umbraco中的动态API比强类型的慢。

除了Chris提到的东西之外,还有一个性能优势,因为Umbraco中的动态API比强类型API慢。

此外,在Umbraco v8中将删除动态类型:

此外,在Umbraco v8中将删除动态类型:

如果您使用的是Umbraco 7.4+,我真的建议您使用Modelsbuilder。它是Umbraco核心的一部分,为您提供强类型属性。因此,您不需要执行Model.GetPropertyValue(“别名”),而可以执行Model.aliasName。这与使用dynamics时非常相似,但如果正确配置VisualStudio,则可以使用intellisense。假设您使用的是Umbraco 7.4+,我真的建议您使用Modelsbuilder。这是翁布拉科核心的一部分