问题标签 [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 投票
2 回答
981 浏览

c# - C# 访问值类型属性,如变量

我想知道 C# 属性是否可以实现以下操作。

我有一个“变换”类,它在私有成员字段中保存一个 4x4 矩阵。现在我想创建一个这样的属性:

但我想提供以下功能:

这样可以直接更改属性,就好像它是一个变量一样。这对 C# 有可能吗?(Vector3 和 Matrix 都是结构体。)

谢谢!

0 投票
9 回答
1800 浏览

c# - C# 支持值类型和引用类型,但它们都是对象吗?

我知道 C# 既有值类型又有引用类型,但你怎么能这样做:

如果 age 是一个值类型,它怎么会有一个 ToString 方法呢?它是否仅在内部需要时才转换为对象?

0 投票
2 回答
1437 浏览

.net - 如何区分一个类型是ValueType还是RefereceType?

一些简单的类型,如 int、string ......很容易意识到它们是 ValueTypes 或 RefrenceTypes。但是我想知道有什么方法可以区分吗?

0 投票
3 回答
1996 浏览

nhibernate - 将 NHibernate ICompositeUserType 与值类型一起使用

我有一个域模型对象,它具有 System.DateTimeOffset 类型的属性。我正在使用一个本机不支持这种类型的数据库,所以我打算使用“datetime”类型的列和“smallint”类型的列来存储它。

我已经研究了如何使用 NHibernate 组件来映射它,并发现它可以使用 ICompositeUserType 实例来工作。但是,在实现接口时,我遇到了一个名为“SetPropertyValue”的方法,它表面上设置了类型内的属性。由于 DateTimeOffset 是 System.ValueType,因此仅设置这样的属性是行不通的,因为它是不可变的(至少,不使用我想避免的一些反射或不安全的代码)。由于 SetPropertyValue 上的实例参数不是“ref”,因此如何将 ValueType 实例用作 NHibernate 中的组件?

0 投票
1 回答
1144 浏览

c# - 值类型的对象扩展方法

我有一个扩展方法:

扩展适用于引用类型,但不适用于值类型。我认为这是因为 object 可以为空。我如何将上面的方法编写为目标值类型,甚至可以不为每个值类型写出来吗?

干杯,

富有的

0 投票
1 回答
345 浏览

.net - 排序引用类型与值类型的性能

我们试图在 .NET 中对 FileInfo 对象的集合进行排序。我们实现了 IComparer 以确保 FileInfo 对象根据我们的标准进行排序。然后我们注意到对 FileInfo 对象进行排序的性能比整数要慢很多倍。凭直觉(并记住引用在 C 中是如何工作的),我们能够通过使用局部变量来限制我们引用 FileInfo 属性的次数来提高性能。

我的想法是访问局部变量比访问对象上的属性更快。我认为这在非​​托管代码的世界中是有意义的,在那里我实际上可以想象堆栈是如何工作的以及如何引用值。但是,我知道托管代码的世界在幕后可能会更加复杂。我的问题是:这些非托管代码中的内存管理和程序流程的基本思想可以普遍地投射到托管代码的世界中吗?

最终在 KeeperOfTheSoul 的帮助下,我们能够追踪到我们是如何模拟 FileInfo 对象的。出于这个原因,我在这个问题中添加了一个 RhinoMock 标签。

0 投票
2 回答
131 浏览

.net - 如何判断类型是否需要装箱?

MSDN 文档说只有值类型需要装箱,但这不适用于字符串,它是一种值类型,不需要装箱。我最初尝试过 Type.IsValueType,但由于它对字符串返回 true,因此我无法使用它来确定类型是否真的需要装箱。还有其他你知道的方法吗?字符串是唯一的例外吗?

更新:我在我的代码中犯了一个错误,我引用了一个 int 并且我认为它是一个字符串。字符串实际上是一种值类型,感谢您指出!

0 投票
3 回答
3535 浏览

c# - 将不同值类型的数组转换为字节数组

到目前为止,这是我想出的,但似乎不是很理想,关于更好方法的任何想法?

0 投票
8 回答
22921 浏览

c# - C#,将一个 bool 复制到另一个(通过 ref,而不是 val)

我在这里的一堵砖墙上。是否可以将一个布尔值复制到另一个布尔值。考虑这段代码。. .

b 现在是一个完全独立的布尔值,值为 false。如果我随后更改 a,它将对 b 没有影响。是否可以通过 ref 使 a = b?我该怎么做?

非常感谢

0 投票
3 回答
233 浏览

.net - 声明和构造值类型对象有区别吗?

我已经在 .NET 中工作了一段时间,但偶尔我仍然会对框架与我之前在 C++ 方面的经验之间的差异感到困惑。

在 .NET 中,所有对象要么是值类型,要么是引用类型。引用类型在堆上分配,而值类型在堆栈上分配(无论如何,在当前的 CLR 实现中)。我明白了。但是,至少在 VB.NET 中,您仍然可以在值类型上定义构造函数。你可以这样做:

有了这段代码,我可以编写Dim c As Coordinates然后访问c自己的成员,或者我可以编写Dim c As New Coordinates(10, 20, 30). 这两种方法有什么区别?显然,new关键字不是在堆上分配对象,因为它是一种值类型。我只是不清楚值类型的构造函数是否仅仅是一种方便,或者它们是否真的一些其他的事情,而不是像任何其他方法一样执行。

为了让我的观点更清楚:我可以很容易地删除New上面代码中的定义,但我仍然可以这样做:

这两行有什么不同吗?


编辑:Guffa 指出声明和构造是一样的。下面的代码演示了这一点:

因此,在涉及迭代的场景中,表示值类型的局部变量不会在堆栈上重新分配;他们留在原地。我使用普通的旧整数查看了相同的场景并发现了相同的行为: