是原始的种类不同Java和C#?
-
22-09-2019 - |
题
我的手动代码转换从爪哇C#和挣扎(什么我呼叫)基本类型(例如见 做自动装箱和拆箱的行为不同Java和C#).从答案,我的理解是, double
(C#)和 Double
(C#)是等和 double
(C#)也可使用的容器,例如作为一个关键在一词典。但是, double
(Java)不能使用集装箱像哈希这就是为什么它是自动装箱的到 Double
(Java)。
- 是
double
(C#)一个原始的或一对象? - 如果它是一种原始的是什么使得它有不同的表现从
double
(Java)?
double
(C#)不能设置空,除非它是由 nullable
.
- 是
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>
包装类型。此外,像爪哇,具有隐性转换,从值的类型 T
要 Nullable<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.Double
和 int
是的别名 System.Int32
.除非不同 Double
类型是进口的范围 double
和 Double
将参照相同种类型。我推荐使用的别名,除非有理由这样做。
其他提示
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#中,最好的方式独立的目的是,通过"价值的类型",这是有点像原始 int
s, bool
s等和"参照类型"类等。