问题标签 [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 回答
2690 浏览

c# - 字典中的复合键;覆盖 GetHashCode()、Equals 等或使用结构?

我有很多字典,其中的键是几个不同值(主要是字符串和整数)的组合。我是将这些键实现为类(和 overrideGetHashCode()Equals())还是struct改用?

ReSharper 使覆盖变得容易,但代码看起来很糟糕。改用结构是否有任何性能影响?

0 投票
3 回答
165 浏览

.net - 比较值类型 N 的对象

比较值类型 N 的对象的最佳方法是什么?所以我想根据对象的类型进行字符串、整数、日期时间等比较。

0 投票
4 回答
1376 浏览

c# - 在 C# 中嵌入 IronPython 时如何处理值类型?

在IronPython中使用 .NET 值类型时,有一个众所周知的问题。最近,当我尝试在 C# 中使用 Python 作为嵌入式脚本语言时,这让我很头疼。问题可以总结如下:

给定一个 C# 结构,例如:

还有一个 C# 类,例如:

IronPython 中会发生以下情况:

正如文章所述,这意味着值类型大多是不可变的。但是,这是一个问题,因为我正计划使用如上所示实现的向量库。是否有任何解决方法可以使用依赖于值类型的现有库?修改库将是最后的手段,但我宁愿避免这样做。

0 投票
4 回答
1996 浏览

.net - CLR (.NET) 如何在内部分配和传递自定义值类型(结构)?

问题:

是否所有 CLR 值类型(包括用户定义struct的 s)都排他地存在于评估堆栈上,这意味着它们永远不需要被垃圾收集器回收,或者是否存在它们被垃圾收集的情况?

背景:

我之前问过一个关于流畅接口对 .NET 应用程序运行时性能的影响的问题。我特别担心创建大量非常短暂的临时对象会通过更频繁的垃圾收集对运行时性能产生负面影响。

现在我突然想到,如果我将这些临时对象的类型声明为struct(即作为用户定义的值类型)而不是class,那么如果事实证明所有值类型都只存在于评估堆栈。

(这发生在我身上主要是因为我在考虑 C++ 处理局部变量的方式。通常是自动(auto)变量,它们被分配在堆栈上,因此当程序执行返回给调用者时被释放 - 没有通过new/进行动态内存管理delete完全参与。我认为CLR可能会struct类似地处理s。)

到目前为止我发现了什么:

我做了一个简短的实验,看看为用户定义的值类型和引用类型生成的 CIL 有什么区别。这是我的 C# 代码:

这是为最后四行代码生成的 CIL:

我无法从这段代码中弄清楚的是:

  • .locals分配的块中提到的所有这些局部变量在哪里?它们是如何分配的?他们是如何被释放的?

  • (题外话:为什么需要和来回复制这么多匿名局部变量,只是为了初始化我的两个局部变量rtvt?)

0 投票
1 回答
8736 浏览

c# - 为什么固定大小的缓冲区(数组)一定是不安全的?

假设我想要一个 7 字节(或 3 或 777)的值类型。

我可以这样定义:

定义它的更简单方法是使用固定缓冲区

当然,第二个定义更简单。问题在于必须为固定缓冲区提供的 unsafe 关键字。我知道这是使用指针实现的,因此不安全。

我的问题是为什么它必须是不安全的?为什么 C# 不能提供任意恒定长度的数组并将它们保留为值类型,而不是使其成为 C# 引用类型数组或不安全的缓冲区?

0 投票
2 回答
224 浏览

.net - NHibernate 和具有值语义的对象

问题:如果我将一个具有值语义的类(重写了 Equals 方法)传递给 NHibernate,NHibernate 会尝试将其保存到 db,即使它只是将一个按值(但不是按引用)相等的实体保存到数据库。我究竟做错了什么?

这是我的问题的简化示例模型:

假设我有一个Person实体和一个City实体。一个线程(生产者)正在创建属于特定现有城市的Person 对象,另一个线程(消费者)正在将它们保存到存储库(使用 NHibernate 作为 DAL)。

由于一次刷新了很多对象,因此我使用 Guid.Comb id 来确保每个插入都是使用单个 SQL 命令进行的。City 是一个具有值类型语义的对象(仅在名称上相等 - 仅用于此示例目的):

Fluent NH 映射类似于:

现在(使用我当前的 NHibernate 映射配置),我的消费者线程维护一个城市字典并替换传入人员对象中的引用(否则 NHibernate 将看到一个新的、非缓存的城市对象并尝试保存它),并且我需要为每个生成的 Person 对象执行此操作。

由于我已经实现了 City 类以表现得像一个值类型,我希望 NHibernate 会按值比较 Cities 而不是每次都尝试保存它们——即我只需要在每个会话中进行一次查找而不再关心它们.

这可能吗,如果是的话,我在这里做错了什么?

0 投票
4 回答
41024 浏览

c# - 测试对象是否为枚举

我想知道'theObject'是否是一个枚举(任何枚举类型)

0 投票
4 回答
29854 浏览

c# - 如何在 C# 中存储对整数的引用?

可能重复:
如何通过“引用”分配给 c# 中的类字段?

大家好 - 告诉我如何进行这项工作?基本上,我需要一个整数引用类型(int* 可以在 C++ 中工作)

我必须使用拳击吗?

编辑: 也许我应该更具体。我正在编写一个 BitAccessor 类,它只允许访问单个位。这是我想要的用法:

用法:

要使 BitAccessor 能够修改 m_val,它需要对其进行引用。但我想在很多地方使用这个 BitAccessor,只需要引用所需的整数。

0 投票
3 回答
2283 浏览

.net - 引用类型中定义的值类型存储在哪里(堆或堆栈)?

在引用类型中定义的值类型是存储在堆上还是堆栈上?

  1. 如果存储在堆中,那么值类型何时存储在堆栈中?
  2. 如果存储在堆栈中,那么堆内部的内容是什么,因为所有内容最终都以值类型结束?
0 投票
4 回答
17867 浏览

c# - 结构、接口和装箱

可能重复:
结构实现接口是否安全?

拿这个代码:

然后我在某处这样做:

在这种情况下是SomeStruct盒装的吗?