gpt4 book ai didi

javascript - 防止编译器将两个动态对象精简为一个

转载 作者:行者123 更新时间:2023-11-29 15:36:50 25 4
gpt4 key购买 nike

我在 VS2012 中有一个大型 MVC4 应用程序,其 Controller 函数将简单的动态对象(作为 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}))

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

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

最佳答案

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

动态类型,根据编译器创建它们的方式的性质,必须将相同的签名折叠为一种类型(以免您永远无法再次创建相同的类型)。这与 VB 的性质相结合意味着你被卡住了。

所以你真的有几个选择:

  1. 在整个组织内实现一致的编码用例标准。这可以通过 checkin 政策、代码审查或任何适合您的流程来实现。

  2. 有了新的静态分析和编译器源代码,您可以构建静态代码分析规则来检测这种情况。但这并不容易。

  3. 为返回类型使用命名类来完全避免这个问题。我知道你害怕类膨胀,但如果你在多个 Controller 中使用相同的动态类型,你可能无论如何都应该有静态类。真的,一个文件的成本是多少?没有什么。这是最佳选择,也是三者中最易于维护的。

关于javascript - 防止编译器将两个动态对象精简为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27429560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com