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

c# - Java和C#中“原始”、“值类型”、“结构”、“类”、“包装”的定义

我一直试图了解 Java 和 C# 中“原语”的使用以及它们之间的区别(如果有的话)。我已经就 SO 提出了一系列问题,其中一些答案似乎混淆了这个问题,而不是澄清它。一些答案(和一些 MS 文档)似乎提供了相互矛盾的陈述。从 SO

并来自 MS: http: //msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx - “结构与类非常相似” - “Int32类包装int数据类型” - “另一方面,C# 中的所有原始数据类型都是 System 命名空间中的对象。对于每种数据类型,都提供了一个短名称或别名。例如,int是 System.Int32 的短名称”。

我的困惑主要在于 C#(我已经编写了一段时间的 java 程序)。

编辑@Jon Skeet 已确认以下段落是正确的

  • Java 有两种类型(原始类型和类)。“值类型”这个词可能是原始(尽管没有广泛使用)的同义词,也是类的“引用类型”的同义词。Java 在类 (Integer) 中“包装”原语 (int),这些类具有任何其他类的完整功能(可以为 null,用于集合等)

编辑@Jon 对 C# 给出了非常明确的声明,所以我将删除我建议的事实并参考他的回答。

进一步的问题:对于这些术语的实际使用应该是什么达成共识?如果有共识,我将非常感谢明确说明。否则,我认为术语是混乱的,因此用途有限。

总结感谢您提供非常明确的答案。真正理解这一点的人达成了共识(参见@Jon 接受的答案),MS 文档是一致的(尽管他们在某些地方提到了 Java,而我误读了这些 C#)

0 投票
6 回答
1550 浏览

c# - Is it possible to change the default value of a primitive data type?

I recently created a generic Matrix<T> class that acts as a wrapper around a List<List<T>> collection. As far as I can tell, this class is working perfectly. I am running into a slight problem though regarding the default values of the T's.

I create an instance of Matrix<int>(3, 3), which creates a 3x3 matrix of ints, all defaulted to 0 using default(T). I know that value types (which include primitives) default to a 0 equivalent, and reference types default to null. I was wondering if it was possible to change this default value so that if a value type is passed into the Matrix, it would be populated with 5's for example, instead of 0's.

I tried creating my own struct (value type), but due to not being able to use parameterless constructors inside structs, I cannot find a way to change the default value from 0.

I suspect changing the default value is not possible, and I will have to loop through the Matrix cell by cell after it has been instantiated, but I wanted to ask on here just in case before I do that.

0 投票
8 回答
539 浏览

c# - C# 教学参考资料

几周后,作为第一年编程课程的一部分,我将向一年级工程师教授 C# 中引用的要点。他们中的大多数人以前从未编程过,并且在学习对象方面遇到了很多麻烦,因此教授参考资料将是一场艰苦的战斗。我计划提供很多示例供学生自己完成,但是如果基本概念没有“点击”,那么仅仅展示一堆示例往往会让人不知所措。

因此,我将向 SO 社区提出问题:您看到参考资料教授的最佳方式是什么?是什么让它为您“点击”?我是否缺少任何与参考相关的材料?

我的初步教学计划是:

  1. 什么是参考(使用像 Eric Lippert's 这样的论点
  2. 参考资料和垃圾收集器
  3. 引用类型和值类型
  4. 不可变类型
  5. 按引用传递与按值传递(以及对象引用的所有微妙之处都按值传递)
  6. 如果您不理解 1-5,会产生意想不到的结果的一些令人讨厌的示例。
0 投票
6 回答
16781 浏览

c# - ValueTypes 如何从 Object (ReferenceType) 派生并且仍然是 ValueTypes?

C# 不允许结构派生自类,但所有 ValueTypes 都派生自 Object。这种区别在哪里?

CLR 如何处理这个问题?

0 投票
1 回答
8850 浏览

c# - 将结构与 WCF 服务一起使用

是否有关于将结构用作 WCF 服务的返回类型的官方建议?

我目前正在与一个我没有编写的服务进行交互,并发现自己受到启发,询问我的烦恼是否有道理。

我过去总是使用类——可能部分是因为样本总是显示的,但我现在想,其他“直观”的原因:

  • 我通过定义一个单独的项目来开始合同样式,该项目的接口表示将由服务来回传递的类型。

  • 我经常使用 LINQ,因此对于可空性的测试对于引用类型是隐含的,而对于结构和其他值类型,我总是需要将其标记为可空性。

尽管我承认它比我脑海中的项目符号列表更直观,但这些都是我马上想到的。我想问这个问题,因为我正在处理一个返回结构的服务,并且在处理返回值时必须编写:

代替

0 投票
7 回答
2650 浏览

c# - 是否可以克隆 ValueType?

是否可以克隆一个对象,当它已知是一个装箱的 ValueType 时,而不编写特定于类型的克隆代码?

一些代码供参考

我遇到的特殊问题是基于值堆栈的虚拟指令机。(而且我懒得写 typeof(int) typeof(DateTime)....)

更新我想我把自己(和其他一些人)弄糊涂了。我的工作解决方案是;

0 投票
1 回答
1456 浏览

java - 在 Java 中解组包含 valuetype 对象的 CDR 流时如何更改字节顺序

我已经以文件的形式(即,未打包在 GIOP 消息中)单独获得了编组的 CDR 数据,我需要将其解组并显示在屏幕上。我通过以下方式了解数据是什么类型,并有工作代码可以成功地做到这一点:

其中 init() 调用 myObjectImpl() 的构造函数。_read 是 org.omg.CORBA.portable.Streamable _read(InputStream) 方法。

只要封送数据与运行我的阅读器程序的计算机具有相同的字节序,这就会起作用,但是我需要能够处理数据的字节序与运行阅读器的计算机的字节序不同的情况。我知道字节序存在于 GIOP 消息中,而我没有。假设我发现我需要更改字节顺序,我该如何告诉流阅读器?

谢谢!

0 投票
5 回答
701 浏览

c# - 可变数量的参数而不装箱值类型?

上述签名的问题在于,将传递给该方法的每个值类型都将被隐式装箱,这对我来说是严重的性能问题。

有没有办法在不装箱值类型的情况下清除接受可变数量参数的方法?

谢谢。

0 投票
3 回答
3849 浏览

c# - .NET 值类型在内存中的布局

我有以下 .NET 值类型:

我有将指向值类型的指针传递给非托管代码的代码,以及通过调用 System.Runtime.InteropServices.Marshal.OffsetOf 发现的偏移量。非托管代码正在填充 Date 和 double 值。

为 StringPair 结构报告的偏移量正是我所期望的:0、8、16、24、32

我在测试函数中有以下代码:

哪个打印出这些偏移量。

然后我有一些测试代码: foreach (StringPair pair in pairs) { Date d = pair.D; 双 v = 对.V; ...

在调试器中具有以下与之关联的汇编程序:

它在偏移量 32 (0x20) 处加载 D 字段,在偏移量 24 (0x38-0x20) 处加载 V 字段。JIT 改变了顺序。Visual Studio 调试器也显示了这种倒序。

为什么!?我一直在拔头发,试图看看我的逻辑哪里出了问题。如果我在结构中交换 D 和 V 的顺序,那么一切正常,但是此代码需要能够处理其他开发人员定义了结构的插件架构,并且不能期望他们记住神秘的布局规则。

0 投票
3 回答
648 浏览

c# - 使用闭包来跟踪变量:好主意还是肮脏的把戏?

好的,我需要能够跟踪值类型对象,这些对象是另一个对象的属性,如果不让这些属性实现 IObservable 接口或类似接口,就无法做到这一点。然后我想到了闭包和 Jon Skeet 的著名例子,以及它是如何多次打印出 9(或 10)而不是数字的升序。所以我想为什么不这样做:

显然,这需要对闭包的工作原理有所了解,但我的问题是:这是一个好主意还是一个肮脏的黑客和对闭包系统的滥用?

编辑:由于有些人似乎误解了我想说的话,这里有一个控制台程序来演示它:

5那将打印出来10