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

c# - 将任意值类型的数组作为形参

我希望能够将函数声明为

在 C# 2.0 中。如果我将其声明为

它可以编译,但是 data[] 中的元素被视为派生自object,例如,我不能说类似

我想避免将 void* 作为参数——我只想能够接受任何值类型的数组,然后对其执行非托管操作。

ETA:另外,这也有同样的问题:

万一你想知道。修复失败,因为它被视为托管类型 - CS0208,无法声明指向托管类型的指针。见下文“毫米”。我认为他是对的......这可能只是无法完成。

0 投票
12 回答
196715 浏览

c# - 在 C# 中,为什么 String 是一种行为类似于值类型的引用类型?

String 是一种引用类型,尽管它具有值类型的大部分特征,例如不可变和重载 == 以比较文本,而不是确保它们引用同一个对象。

那么为什么字符串不只是一个值类型呢?

0 投票
1 回答
1191 浏览

asp.net-mvc - 在 ASP.NET MVC 的局部视图中使用值类型作为模型

有没有办法使用这样的东西:System.Web.Mvc.ViewUserControl<DateTime>?我得到一个异常,该类型是值类型,而不是引用类型。解决此问题的正确方法是什么?谢谢。

编辑

我想要完成的是拥有一个控件DateTime来呈现日历。我想DateTime使用 MVC 的“点表示法”从我的 ViewData 中传递。

编辑 2

我听说/看到一些 MvcContrib 项目可能具有此功能,但我似乎无法再次找到它。

0 投票
3 回答
4881 浏览

c# - 列表- 表现得像有拳击

我们都知道泛型 List<> 不会装箱值类型。为什么在下面的代码片段中 rects[1] 不受 Inflate 方法的影响?

如果没有装箱并且我想影响 rect[1],我需要编写三行代码,如图所示 - 已注释。有人可以解释一下吗?

0 投票
7 回答
38085 浏览

c# - 如何使用 .NET XmlSerializer 使值类型可以为空?

假设我有这个对象:

XmlSerializer 将像这样序列化对象:

如何使属性 Age 可以为空?IE:当它小于0时不序列化属性Age?

我尝试使用 Nullable,但它像这样序列化我的对象:

通过阅读 MSDN 文档,我发现了这一点:

您不能将 IsNullable 属性应用于类型为值类型的成员,因为值类型不能包含 nullNothingnullptra 空引用(在 Visual Basic 中为 Nothing)。此外,对于可为空的值类型,您不能将此属性设置为 false。当此类类型为 nullNothingnullptra 空引用(Visual Basic 中为 Nothing)时,它们将通过将 xsi:nil 设置为 true 来进行序列化。

来源:http: //msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable.aspx

我知道值类型不能设置为空。值类型总是设置为某事。序列化无法根据其当前值决定是否对其进行序列化。

我尝试了属性,但没有成功。我尝试创建一个 agecontainer 对象并使用属性操作它的序列化,但没有成功。

我真正想要的是:

当属性 Age 小于 0(零)时。


看起来你必须实现自定义序列化。

是的,我也是这么想的,但我想没有它就离开。

在应用程序中,对象要复杂得多,我不想自己处理序列化。

0 投票
12 回答
12445 浏览

c# - 根据定义,值类型是不可变的吗?

我经常读到structs 应该是不可变的——它们不是根据定义吗?

你认为int是不可变的吗?

似乎没问题 - 我们得到一个新的int并将其分配回i. 那这个呢?

好的,我们可以将其视为一条捷径。

struct Point

这真的改变了观点(1, 2)吗?Point.Offset()我们不应该将其视为返回新点的以下快捷方式吗?

这个想法的背景是这样的——一个没有身份的值类型怎么可能是可变的?您必须至少查看两次才能确定它是否发生了变化。但是,如果没有身份,你怎么能做到这一点呢?

我不想通过考虑ref参数和装箱来使推理复杂化。我也知道p = p.Offset(3, 4);表达不变性要好得多p.Offset(3, 4);。但问题仍然存在——值类型在定义上不是不可变的吗?

更新

我认为至少涉及两个概念——变量或字段的可变性和变量值的可变性。

在示例中,我们必须字段 - 一个可变字段和一个不可变字段。因为值类型字段包含整个值,所以存储在不可变字段中的值类型也必须是不可变的。我仍然对结果感到非常惊讶——我没有期望 readonly 字段保持不变。

变量(除了常量)总是可变的,因此它们对值类型的可变性没有限制。


答案似乎不是那么直截了当,所以我将重新表述这个问题。

鉴于以下。

你能给出一个完整的版本Foo和一个使用例子 - 可能包括ref参数和装箱 - 这样就不可能重写所有出现的

0 投票
5 回答
532 浏览

c# - 可空值类型

如果值类型被声明为可为空,我应该如何采取预防措施?即如果在构造函数中我有:

如果源为空,它会失败吗?

0 投票
2 回答
7248 浏览

c# - 在值类型上定义的扩展方法不能用于创建委托 - 为什么不呢?

扩展方法可以分配给与其在对象上的用法相匹配的委托,如下所示:

如果他们扩展的类型是值类型,它将不起作用:

这给

错误 CS1113:在值类型“int”上定义的扩展方法“FunnyExtension.Double(int)”不能用于创建委托。

为什么他们不能?

0 投票
9 回答
7861 浏览

c# - 在 C# 中对值类型进行装箱的用例?

在某些情况下,需要将值类型的实例视为引用类型的实例。对于这种情况,可以通过一个称为装箱的过程将值类型实例转换为引用类型实例。当一个值类型实例被装箱时,存储在堆上分配并且实例的值被复制到那个空间中。对此存储的引用被放置在堆栈上。装箱的值是一个对象,一个包含值类型实例内容的引用类型。

了解 .NET 的通用类型系统

Wikipedia中有一个 Java 示例。但是在 C# 中,在哪些情况下必须将值类型装箱?或者一个更好/类似的问题是,为什么要将值类型存储在堆(装箱)而不是堆栈上?

0 投票
3 回答
2172 浏览

c# - Mutable wrapper of value types to pass into iterators

I'm writing an iterator that needs to pass around a mutable integer.

This nets me "Error 476 Iterators cannot have ref or out parameters".

What I need is this integer value to be modified in the iterator and usable by the caller of the iterator. In other words, whatever calls Foo() above wants to know the end value of valueThatMeansSomething and Foo() may use it itself. Really, I want an integer that is a reference type not a value type.

Only thing I can think of is to write a class that encapsulates my integer and permits me to modify it.

So:

Is there any class or mechanism to handle this already in the BCL? Any flaws with ValueWrapper<T> proposed above?

(My actual use is more complicated than the example above so handling the variable inside my foreach loop that calls Foo() is not an option. Period.)