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

.net - 堆栈是实现细节,还是不是?

根据http://msdn.microsoft.com/en-us/library/ms229017.aspx,值类型“分配在堆栈上或与其他结构内联*”。然而,堆栈中有一个实现细节,Eric Lippert 表示这是一个实现细节。

据我了解,实现细节是“由代码产生的行为,可以通过使用代码来依赖,尽管该行为并未由编写代码的规范指定。” . 我知道文档不是规范,但大概如果文档中列出了我们可以依赖的东西并且它不再是实现细节。那么,堆栈是实现细节还是不是?

*:我理解这意味着结构也可以在其他结构内部分配,而不是直接在堆上,尽管我可能是错的。

0 投票
4 回答
1361 浏览

c# - 将值类型捕获到 lambda 时是否执行复制?

  1. 创建 lambda 时是否创建了 someStruct 的副本?
  2. Foo 返回时是否创建了 someStruct 的副本?
  3. 我可以验证没有发生复制吗?在 C++ 中,我将实现复制构造函数并从其中打印。

来自标准的引用将不胜感激。任何相关的在线文章也是如此。

0 投票
4 回答
8462 浏览

c# - 如何使用反射创建值类型的实例

我想创建一个值类型的实例,如System.String, System.Boolean,System.Int32等。我得到了类型的限定名称System.Stringor MyNamespace.Employee,我必须创建一个实例并返回。我使用Activator.CreateInstanceandFormatterServices.GetUninitializedObject创建实例。但是在值类型的情况下它会失败。在值类型的情况下,我无法对逻辑进行硬编码。我需要一种创建值类型和引用类型实例的通用方法。

0 投票
1 回答
1113 浏览

c# - 从属性返回值类型

关于类中的值类型属性,我对堆栈和堆上发生的事情感到困惑。

到目前为止我的理解:

当您创建具有如下结构(值类型)的类时:

如果你像这样创建一个类实例:

堆栈和堆将如下所示:

https://i962.photobucket.com/albums/ae105/acardy/stackheap-1.jpg(https://i962.photobucket.com/albums/ae105/acardy/stackheap-1.jpg)

...其中 Bar 结构嵌入在堆中的 Foo 类中。这对我来说很有意义,但是当我们考虑在 Foo 对象中修改 BarStruct 类中的 Number 整数时,我开始失去它。例如:

据我了解,这应该是返回 BarStruct 的副本以存在于堆栈中,这意味着 BarStruct 成员的任何更改都不会传递到对象,这就是上面最后一行给出错误的原因。

到目前为止这是正确的吗?

如果是这样,我的问题是,怎么会有这样的任务:

...有效并更改堆值?当然这只是改变堆栈上的值?此外,(渐渐地)我发现它非常令人困惑,以至于您可以在值类型上使用 new 。对我来说,new 用于在堆上分配(根据 C++),并且感觉不自然地为堆栈上的项目执行此操作。

因此,只是为了重申这个问题,我是否正确假设调用包含结构的属性时会发生什么,为什么可以将新结构分配给副本,但它仍然会更改堆上的引用?

真的希望这一切都有意义。

如果您需要澄清,请大喊大叫!

塔,

安迪。

0 投票
8 回答
1620 浏览

.net - 在 C# 中,术语“原始”和“文字”可以互换吗?

今天早些时候的一次讨论让我质疑我对原语和文字的理解是否正确。


我的理解是,文字类型特别是一种可以使用人类和编译器都可以理解的符号分配值的类型,而无需特定的类型声明:


我对原语的理解是,它们本质上是编译器可以理解的元素数据类型,比如 int:


...文字可以是非原始的,例如 VB9 对 XML 文字的支持。一个非现实世界的例子是如果 System.Drawing.Point 可以用文字分配:


最后(这个问题反过来又导致我提出上述问题):我的理解是,一个类型是原始类型还是文字类型,与它是值类型还是引用类型没有直接关系。

例如 System.String 是一种支持文字的引用类型。自定义结构是不支持文字的复合值类型。

我的理解(如果不是我的解释)在很大程度上是正确的吗?


更新:感谢伟大的信息和对话!对于任何发现此问题的人,请务必阅读评论和答案,这里有一些很好的说明以及一些有趣的旁注。

顺便说一句:哪个答案真正值得获得绿色大支票是一个折腾。我将其提供给不幸被否决的答案,该答案不仅包含一个不错的答案,而且在评论线程中包含许多澄清和信息。公平地说,这里没有一个最佳答案,至少有三个:)

0 投票
6 回答
10629 浏览

c# - .NET 参数传递 - 按引用与按值传递

我试图验证我对 C#/.NET/CLR 如何处理值类型和引用类型的理解。我读了很多自相矛盾的解释,我仍然

这是我今天的理解,如果我的假设是错误的,请纠正我。

值类型(例如 int 等)存在于堆栈中,引用类型存在于托管堆中,但是如果引用类型具有例如 double 类型的实例变量,它将与它的对象一起存在于堆中

第二部分是我最困惑的。

让我们考虑一个名为 Person 的简单类。

Person 有一个名为 Name 的属性。

假设我在另一个类中创建了一个 Person 实例,我们将其称为 UselessUtilityClass。

考虑以下代码:

然后我们做的某处:

Person 是一个引用类型,当传递给 UselessUtilityClass - 这是我要去的地方 - 坚果......作为 Person 引用实例的VARIABLE p 由VALUE传递,这意味着当我写 p.Name 我会看到“牧师_”

然后如果我写

我愿意

p2.Name = "不是牧师";

并像下面这样写 p 的名字我会得到“不是牧师”

这是因为它们是引用类型并且指向内存中的相同地址。

我的理解正确吗?

我认为当人们说.NET 中的所有对象都由 Reference 传递时存在一些误解,这与我的想法并不相符。我可能是错的,这就是我来到 Stackers 的原因。

0 投票
2 回答
723 浏览

c# - C# 中的链接属性和意外结果

我只是快速阅读了这篇文章(特别是关于他为什么选择使用结构/字段而不是类/属性)并看到了这一行:

属性的结果不是真正的左值,所以我们不能做像 Vertex.Normal.dx = 0 这样的事情。属性的链接会产生非常意想不到的结果。

他说的是什么意想不到的结果?

0 投票
5 回答
646 浏览

c# - 无法分配从方法返回的结构的属性

我收到以下从德语翻译的错误:

错误 BC30068:表达式是一个值,不能作为赋值的目标。

我正在尝试执行以下操作:

我已将 Cells 声明为:

我怎么解决这个问题?我不希望 Cell 成为一个类,而是成为一个结构,因为否则任何访问都会在堆上创建一个新对象。当然我可以缓存所有创建的单元对象,但这可能会引入错误并浪费大量内存和新的间接层。

有更好的方法吗?

0 投票
6 回答
17224 浏览

c# - Guid 被认为是值类型还是引用类型?

Guid 是使用new关键字创建的,这让我认为它是一种引用类型。

它是否正确?

Guid uid = new Guid();

Guid 是否存储在堆上?

0 投票
2 回答
2212 浏览

c# - 使用比较运算符,例如 '!=' 和 '==',将泛型限制为 C# 中的值

我有以下代码:

当我尝试编译时,它给了我以下错误:

运算符“==”不能应用于“T”和“T”类型的操作数

为什么做不到?如果约束是where T : class它会起作用的。但我需要它是值类型,因为在我的实现中,这个泛型将始终是一个枚举。

我正在做的就是使用Object.Equals()方法来规避这种情况。它会始终确保正确的行为,因为我只是在 T 之间进行比较?