问题标签 [value-type]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - .NET 4.0 字典:值类型键装箱用于徒劳的“空”检查。这会影响性能吗?
例如:
这是来自 .NET 4.0 中 Dictionary<int,Object> 的内部Add方法。尽管泛型被广泛吹捧为有助于避免值类型的装箱,但为什么这个系统组件对值类型键的每个操作进行这种低效检查?如果我理解正确,这不仅会损害性能,而且总是会返回 true (装箱的值类型永远不会是空引用)
编辑:Marc 对此特定问题的回答摘要:重要的原因是此 Dictionary<K,V> 实现已选择禁止使用“null” Nullable<T> 实例作为键。因为 MSIL 框指令对 Nullable<T> 值类型进行了特殊处理,所以检查不一定对所有值类型都无效。
c# - 具有 getter 和 setter 的值类型仍然是值类型吗?
在 C# 中,如果我有以下代码:
VarName
仍然是值类型吗?是否会发生装箱或拆箱?
存储与获取/设置相关的引用是否有任何开销?
c# - 何时使用 C# 结构(值类型)会牺牲性能?
我一直在使用结构作为隐式验证复杂值对象的机制,以及围绕更复杂类的通用结构来确保有效值。我对性能后果有点无知,所以我希望大家能帮助我。例如,如果我要执行诸如将域对象注入值类型包装器之类的操作,那会导致问题吗?为什么?我了解值类型和引用类型之间的区别,我的目标是利用值类型的不同行为。为了负责任地做到这一点,我究竟需要调查什么?
这是我正在考虑的一个非常基本的想法。
c# - 为什么结构中的迭代器可以修改它?
我发现值类型中的迭代器方法是允许修改的this
。
但是,由于 CLR 的限制,调用方法看不到修改。(this
按值传递)
因此,迭代器和非迭代器中的相同代码会产生不同的结果:
输出:
为什么在迭代器中改变结构不是编译器错误(或至少是警告)?
这种行为是一个不易理解的微妙陷阱。
注意:可变结构是邪恶的;这不应该在实践中出现。
c# - T 的通用约束同时是引用类型和值类型?
我在理解通用约束如何工作方面遇到问题。我想我在这里遗漏了一些重要的东西。我已将我的问题附在评论中,并感谢您提供一些解释。
c# - C# 中“half”(binary16)的类型是什么?
我在隐含 nVidia GPU 的环境中工作,这导致我使用“半”(binary16,低精度浮点数)类型。但是,我不知道这在 C# 中转换为哪种类型。任何的想法?
http://en.wikipedia.org/wiki/Half_precision_floating-point_format
c++ - 添加移动构造函数和移动赋值运算符何时会真正开始有所作为?
考虑到当今编译器在返回值优化方面的高质量(RVO 和 NRVO),我想知道开始添加移动构造函数和移动赋值运算符实际上对什么类复杂度有意义。
例如,对于这个really_trivial
类,我只是假设移动语义不能提供比 RVO 和 NRVO 在复制它的实例时已经提供的任何东西:
在这个semi_complex
类中,我会毫不犹豫地添加一个移动构造函数和移动赋值运算符:
那么,添加移动构造函数和移动赋值运算符的成员变量的数量和种类开始变得有意义?
c# - 铸造,拆箱,转换..?
最近我在学习值类型,我有点困惑。此外,铸造和拆箱都使用相同的语法 - (预期类型)(对象),对吗?那么类型之间的简单转换呢,即转换还是转换?
c# - 在 C# 中,值类型与引用类型的使用
我的问题是:
- 我们什么时候应该使用值类型,什么时候应该使用引用类型?
- 一个比另一个有什么优点和缺点?
- 如果在任何地方都使用引用类型怎么办?它有什么害处吗?
还请讨论每种方法的优缺点。我也想明白这一点。
c# - 如何以非递归方式定义“原始”类型?
由于struct
C# 中的 a 由其成员的位组成,因此您不能拥有T
包含任何T
字段的值类型:
我的理解是,永远无法实例化上述类型的实例*——任何这样做的尝试都会导致实例化/分配的无限循环(我猜这会导致堆栈溢出?**)——或者,另一个看待它的方式可能是定义本身没有意义;也许这是一个自欺欺人的实体,有点像“这个陈述是错误的”。
但是,奇怪的是,如果您运行此代码:
...您将获得以下输出:
看来我们在这里被“欺骗”了***。显然,我知道像int
,double
等原始类型必须在 C# 的内部以某种特殊的方式定义(您不能根据该系统定义系统中的每个可能的单元......你可以吗? - 不同的主题, 不管!); 我只是想知道这里发生了什么。
System.Int32
类型(例如)如何实际说明 32 位整数的存储?更一般地说,值类型(作为一种值的定义)如何包含类型为自身的字段?就好像乌龟一路下来。
黑魔法?
*单独说明:这是值类型(“实例化”)的正确词吗?我觉得它带有“类似参考”的内涵;但也许这只是我。另外,我觉得我以前可能问过这个问题——如果是这样,我忘记了人们的回答。
** Martin v. Löwis和Eric Lippert都指出,这既不完全准确,也不是对该问题的适当看法。查看他们的答案以获取更多信息。
***好吧,我意识到没有人真的在撒谎。我并不是要暗示我认为这是错误的;我的怀疑是它在某种程度上过于简单化了。在了解(我认为)thecoop 的答案之后,这对我来说更有意义。