我的手动代码转换从爪哇C#和挣扎(什么我呼叫)基本类型(例如见 做自动装箱和拆箱的行为不同Java和C#).从答案,我的理解是, double (C#)和 Double (C#)是等和 double (C#)也可使用的容器,例如作为一个关键在一词典。但是, double (Java)不能使用集装箱像哈希这就是为什么它是自动装箱的到 Double (Java)。

  1. double (C#)一个原始的或一对象?
  2. 如果它是一种原始的是什么使得它有不同的表现从 double (Java)?

double (C#)不能设置空,除非它是由 nullable.

  1. double? (C#)相当于 Double (Java)?他们都称为的对象?

(是使用的术语"的第一类物"有用的,在这个讨论吗?)

有帮助吗?

解决方案

C#和Java有原始的(或"价值")种类:int、双漂浮,等等。

然而,在这C#和Java往往分裂。

Java具有包装类型 所有的基本类型 (这是一个很小的限定在Java),允许他们作为待处理的对象。double/Double, int/Integer, bool/Boolean, 等等。这些包装类型的基准类型(阅读:课程),正因为如此, null 是一个有效的价值来分配给这样的类型表现方式/变量。最近版本的Java(1.5/5+)增加在隐含的帮助来自元,其相应的包装。

// Java
Boolean b = true; // implicit conversion boolean -> Boolean (Java 5+)
Boolean b = null; // okay, can assign null to a reference type
boolean n = null; // WRONG - null is not a boolean!

C#不提供这样一个直接的包裹1 -部分,因为C#支持 无限价值的类型 通过 结构;相反,C#处理"可空值类型的"通过引入一个 Nullable<T> 包装类型。此外,像爪哇,具有隐性转换,从值的类型 TNullable<T>, 与的限制,T是"不可空类型"本身。

// C#
Nullable<bool> b = true; // implicit conversion bool -> bool?
bool? b = true;          // short type syntax, implicit conversion
bool? b = null;          // okay, can assign null as a Nullable-type
bool b = null;           // WRONG - null is not a bool

注意, Nullable<T> 也是一个值的类型,因此遵循标准的结构的规则为当/如果一个值是"堆"或没有。

在回应的评论:

绝对正确的,可以为空是一个值型不允许它具有更紧凑的内存占 在某些情况下 因为它可以避免的存储器开销的一个参照类型: 是什么内存占用的一个可空的<T>.然而它仍然需要更多的存储于非空类型,因为它们必须记住,如果价值是,嗯,null,或没有。根据对问题和虚拟机执行情况,这可能或不可能明显少于一个"完全"的对象。此外,由于价值观在C#/CLR被抛,考虑任何提升作业,必须进行:

// C#
object x = null;
x = (bool?)true;
(x as bool?).Value // true

该文章 Java小130:你知道你的数据尺寸? 会谈的参考型存储的消耗量(在Java)。有一点要注意的是,JVM有专门版本的阵列境内,每一个基本类型,并对象(然而,请注意,本条包含了一些 误导性发言).注意到如何的对象(相对元)支付额外存储器开销和字节对准问题。C#但是,可以延长优化阵情况 Nullable<T> 类型与在有限的特殊情况下JVM有因为 Nullable<T> 是本身只是一个结构类型(或"原始").

然而,一个目的,只需要一个小型固定的尺寸,以维持一个"参考"这一变量隙。变老虎的类型 Nullable<LargeStruct> 另一方面,必须要有空间 LargeStruct+Nullable (槽本身可以在堆).看看 C#概念:值vs基准类型.注意如何在"解除"的例子上变量的类型 object: object 是"根类型"C#(父母的这两种类型的参考和价值类型)和 一个专门的价值的类型。


1 C#语言支持一个固定的 别名 对于原始的/同类型的允许访问"友好的小写的"种类型的名字。例如, double 是的别名 System.Doubleint 是的别名 System.Int32.除非不同 Double 类型是进口的范围 doubleDouble 将参照相同种类型。我推荐使用的别名,除非有理由这样做。

其他提示

Nullable<double> (aka double?)在C# 同样作为一个 Double 在Java。

前Java有自动装箱/拆箱,你必须手动之间的转换元和一流的对象:

Double dblObj = new Double(2.0);
double dblPrim = dblObj.doubleValue();

在Java1.5改变了,所以你能做的事:

Double dblObj = 2.0;
double dblPrim = dblObj;

和Java会插入代码镜上面的例子。

C#是不同的,因为有一个不限数量的"原始的"类型(什么CLR电话 值的类型).这些行为主要是喜欢Java元,用 值语义.你可以创造新的价值类型的使用 struct 关键词。C#具有自动装箱/拆箱为 所有 值的类型,并且还使得有价值的类型来自 Object.

所以你可以用一个值的类型(喜欢 double)在那里将使用任何物体基准(例如作为一个关键在 Dictionary),它会被装箱,如果有必要,否则就直接使用。(C#'s泛实施是不够好,避免拳击在大多数情况下。)

C#中,最好的方式独立的目的是,通过"价值的类型",这是有点像原始 ints, bools等和"参照类型"类等。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top