防止编译器将两个动态对象简化为一个

时间:2014-12-11 18:08:24

标签: javascript json vb.net asp.net-mvc-4 compiler-optimization

我在VS2012中有一个大型MVC4应用程序,其控制器函数将简单的动态对象(作为JSON)返回给jQuery $ .post函数。

编译器似乎正在将具有相同属性定义(但不同的字母大小写)的对象组合到同一个对象中。这在尝试回读javascript中的属性时会导致问题。

Dim js As New System.Web.Script.Serialization.JavaScriptSerializer()

'should return  {"TEST":true} and does
MessageBox.Show(js.Serialize(New With {.TEST = True})) 

' should return  {"test":true} but returns {"TEST":true} if the above code exists.
MessageBox.Show(js.Serialize(New With {.test = True})) 

该项目涉及多个开发人员,因此扫描代码以查找此问题的实例并不总是切实可行。

有没有办法阻止这种优化?

1 个答案:

答案 0 :(得分:1)

VB.Net不区分大小写,因此将考虑不同类型的动态类型。它只是语言的工作方式,而不是可以改变的东西。类似地,仅按大小写不同的类/参数等被视为相同/不允许。这不是“编译器优化”,而是语言的工作方式。

动态类型,根据编译器如何创建它们的性质,必须将相同的签名折叠为一种类型(以免再也无法创建相同的类型)。结合VB的性质意味着你被困住了。

所以你真的有几个选择:

  1. 在您的组织中实施一致的编码案例标准。这可以通过签到政策,代码审查或任何适合您的流程来实施。

  2. 现在可以使用新的静态分析和编译器源,您可以构建静态代码分析规则来检测此方案。但这并不容易。

  3. 将命名类用于返回类型以完全避免此问题。我知道你害怕类膨胀,但如果你在多个控制器中使用相同的动态类型,你可能应该有静态类。真的,文件的成本是多少?没有。这是最好的选择,也是三者中最容易维护的选择。