在 C# 中,将 long 转换为 ulong 时是否涉及装箱和拆箱,反之亦然?

问题描述 投票:0回答:2

我知道装箱然后拆箱在计算上是昂贵的,并且在将值类型转换为对象或其他引用类型然后返回值类型时会发生这种情况。但是,当我将 long 转换为 ulong 或者反之亦然时,会发生这种情况吗?

我有以下代码:

ulong number = (ulong)IPAddress.NetworkToHostOrder((long)BitConverter.ToUInt64(bytes));

我的理解是,由于 long 和 ulong 都是值类型,因此它们之间的转换不会涉及任何装箱或拆箱。

我只是想确定一下,上面的代码是否涉及装箱和拆箱?

c# endianness boxing
2个回答
1
投票

ulong
long
都是值类型。仅当您将值类型转换为引用类型时才会发生装箱。

NetworkToHostOrder 的源代码在这里。如您所见,那里也没有装箱;这只是位操作。

如果您使用从

ulong
long
的已检查转换,这超出了
long
的范围,可能会出现一些奇怪的情况,因为将创建一个异常对象。但那时你可能有更大的问题。


0
投票

你的假设是正确的。

这些都是值类型,都是 8 个字节。由于您正在从值类型更改为另一种值类型,因此两者都不是。当您从一个转换为另一个时,您只是在更改控制数字符号的位——这意味着它是正数还是负数。

所以这不是装箱也不是拆箱。当您从 long 转换为 ulong 或从 long 转换为 ulong 时,这称为显式类型转换。

什么是拳击?装箱是将值类型转换为 此值类型实现的对象类型或任何接口类型。 拳击是隐含的。

什么是拆箱?拆箱是装箱的逆过程。这是过程 将引用类型转换为值类型。开箱提取 来自引用类型的值并将其分配给值类型。

C# Explicit Type Conversion (Cast) 需要显式转换 当数据无法从一种简单类型转换为另一种时 由编译器自动或当转换可能改变值时 由于可能丢失数据而产生不正确的结果 (缩小转换)。为了防止在以下情况下出现编译错误 由于类型之间的隐式转换,信息可能会丢失, 编译器要求您使用强制转换运算符来执行类型 转换。使用显式转换时,您故意强制 编译器转换值,即使有损失 信息。请记住,所有演员都可能不安全。

C#隐式类型转换(隐藏)如果将一种类型转换成 另一种由 CLR 自动生成的类型,称为隐式类型 转换。不需要特殊的转换语法,也不会丢失数据 在隐式转换期间。尽管精度损失 可能发生在转换过程中,这是允许的,永远不会 导致编译器出现运行时异常,这是一个扩大的原语 转换总是成功的,转换是从较小的到 更大的数据类型,完全没有任何数据丢失的风险——对于 例如,将 int 转换为 double。

https://codebuns.com/csharp-basics/type-conversion/

© www.soinside.com 2019 - 2024. All rights reserved.