问题标签 [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.

0 投票
3 回答
999 浏览

c# - 为什么委托逆变不能与值类型一起使用?

此代码段未在 LINQPad 中编译。

编译器的错误信息是:

'UserQuery.IsNull(object)' 没有重载匹配委托 'System.Func'

它适用于字符串数组,但不适用于int[]. 它显然与拳击有关,但我想知道细节。

0 投票
5 回答
3812 浏览

c# - 将枚举设置为其默认值

我敢肯定这是相当微不足道的,但我无法做到正确。

该行value = default(value.GetType());无法编译,但希望您能看到我正在尝试的内容。我需要将 Enum 参数设置为它自己类型的默认值。

0 投票
4 回答
786 浏览

.net - .Net 中的结构字符串会有好处吗?

注意:这是一个假设性讨论。我实际上并不想实现结构字符串。

.Net String 类可以是值类型(结构),因为它是不可变的并且成员很少。但是 String 不是值类型。可能是因为 String 是在引入可空类型之前设计的,或者可能是为了匹配 Java 字符串的行为。

将 String 更改为值类型或实现 String 的值类型变体是否有益?它将删除一个间接级别并匹配常见的不可为空的情况。

0 投票
1 回答
609 浏览

vb.net - VB.NET 指向值类型的指针

VB.NET 2010、.NET 4

大家好,

我绝不是一个好的程序员,我只是想把我的脑袋绕在这些东西上,所以如果这是一个愚蠢的问题,请原谅我。

我希望以下内容生成一个显示“2”而不是“5”的消息框:

这行不通。消息框显示“5”。我想我在某种程度上理解了为什么。由于 SomeInt 是一个值类型,将它添加到 SomeListOfInts 只是添加一个副本。如果这不连贯,我很抱歉。有没有什么直接的方法可以做到这一点?

在此先感谢,布赖恩

编辑:我只是想补充一下,我怀疑人们会说“为什么要这样做?”/“这不是一件好事。” 等等。我对此很好,并且想知道一种更好的方法(如果有的话),但是,我通常也很好奇如何完成这样的事情,无论它是否是好的做法。另外,如果这不是好的做法(无论这意味着什么),为什么?

0 投票
4 回答
1840 浏览

wpf - 列表项是值类型/结构并包含重复项的列表框的选择错误?

我将 Horizo​​ntal ItemsControl 转换为 Listbox,以便能够选择单个项目,但发现选择已损坏。花了一些时间来提炼出有问题的部分。

如果 Book 是一个结构,如果您选择的项目在列表中具有等效结构,则列表框选择(默认模式:单一)会出错。例如书 3

如果 Book 变成一个类(具有非值类型语义),则选择是固定的。

选择(到目前为止,不喜欢其中任何一个):

  • 我选择 structs 是因为它是一个小型数据结构,并且值类型语义在比较 2 个实例是否相等时很有用。将其更改为类会导致我失去值类型语义。我不能再使用默认的 Equals 或覆盖它以进行成员比较。
  • 添加一个独特的 Book 属性,纯粹是为了让列表框选择起作用(例如索引)。
  • 消除重复.. 不可能。

WPF 列表框:选择问题:声明列表框正在设置 SelectedItem,并且在为此更新 UI 时,它只是点亮列表中的所有项目Equal(SelectedItem)。不知道为什么.. 突出 SelectedIndex 会使这个问题消失;也许我错过了一些东西。 即使在 SelectionMode="Single" 中,ListBox 也会选择许多项目:当列表项目是字符串时显示相同的问题(值类型语义)

0 投票
3 回答
56698 浏览

vb.net - VB检查int是否为空

一个非常无聊的问题,对不起,但我真的不知道;)我总是尝试使用 string.empty,但是使用小数会产生错误。

有什么功能吗?不幸的是,对于最简单的问题,谷歌没有答案

0 投票
6 回答
821 浏览

java - 与 Java 不同,为什么在 .NET 中对原始值类型进行装箱是未缓存的?

考虑:

显然,每条装箱指令都分配了一个单独的装箱实例Int32,这就是它们之间的引用相等性失败的原因。此页面似乎表明这是指定的行为:

box 指令将“原始”(未装箱)值类型转换为对象引用(O 类型)。这是通过创建一个新对象 并将数据从值类型复制到新分配的对象中来实现的。

但是为什么一定要这样呢?是否有任何令人信服的理由说明 CLR 不选择Int32为所有原始值类型(都是不可变的)保存装箱 s 的“缓存”,甚至更强大的通用值?我知道Java有这样的东西。

ArrayList在没有泛型的时代,对于主要由小整数组成的大数据,它不会对减少内存需求和 GC 工作量有很大帮助吗?我也确信存在几个确实使用泛型的现代.NET 应用程序,但无论出于何种原因(反射、接口分配等),运行大型装箱分配,可以通过(似乎是)大量减少简单的优化。

那么是什么原因呢?我没有考虑到一些性能影响(我怀疑测试该项目是否在缓存中等是否会导致净性能损失,但我知道什么)?实施困难?不安全代码的问题?打破向后兼容性(我想不出一个好的程序应该依赖现有行为的任何充分理由)?或者是其他东西?

编辑:我真正建议的是“常见”原语的静态缓存,就像 Java 所做的那样。有关示例实现,请参阅 Jon Skeet 的回答。我知道在运行时对任意、可能可变的值类型或动态“记忆”实例执行此操作是完全不同的事情。

编辑:为清楚起见更改了标题。

0 投票
3 回答
210 浏览

c# - .NET 中用户创建的结构和框架结构之间的差异

为什么 C# 编译器不允许你编译这个:

但确实允许您编译:

其中 MyStruct 定义为:

更新:在第一种情况下,错误是:

错误 1 ​​使用未分配的局部变量“a”

0 投票
3 回答
5130 浏览

c# - 用 null 初始化的 C# 值类型

在 C# 3.0 中,您可以将 null 分配给 int? 类型(在 CLR int? 中是一个结构):

但是当你定义一个自定义结构时:

编译这段代码时出错:

错误如下:

而int?是 CLR 中的一个结构,我们可以为它分配 null 有点违反直觉。我想 null 被隐式强制转换或装箱为 certian int?表示空值的值。它是如何精确完成的?如何以可以执行该行的方式扩展 MyStruct:

0 投票
1 回答
385 浏览

.net - 如何使用 Mono.Cecil 确定值类型的大小

我正在寻找一种方法来确定 Mono.Cecil 中值类型(TypeReference)的字节大小。

我需要它来优化 Nullable 相等比较代码生成。

  • 如果值类型大小 > 4,首先比较 HasValue,然后比较值。
  • 如果值类型大小 <= 4,首先比较 GetValueOrDefault,然后比较 HasValue。

但要这样做,我需要以某种方式获取 sizeof(T)。