【发布时间】:2017-04-12 06:01:06
【问题描述】:
我有一系列短裤:
short[] data;
我有一个将字节写入文件的函数:
void Write(byte[] data);
我不控制这个功能,也不能改变它。有没有办法在不先制作冗余副本将其转换为字节的情况下编写我的短裤数组?
类似的东西:Write((byte[])data);
我不关心字节顺序。我想要以任何机器表示形式写入文件的短裤的内存表示。我知道这种类型的转换不适用于任何包含引用的非 POD 类型,但短裤应该是完全可转换的。强制转换应生成两倍大小的字节数组,指向相同的内存。
如果这在 C# 中是不可能的,那么 CLR 中是否有任何东西使这不可能,或者仅仅是 C# 的限制?
【问题讨论】:
-
你的代码以后依赖的东西没有任何“冗余”。出于好奇而制作副本有什么问题?
-
一个short是两个字节,一个字节是......一个字节。你打算如何转换它?
-
Array.ConvertAll(array, item => (byte)item)是您将获得的最佳选择。这确保了数组只迭代一次。让编译器处理性能影响。如果你关心这种低级的东西,你就不会用 C# 编写。 -
那么使用 C# 对性能的影响是不可接受的。这就是它的工作原理。不,当然,副本不会与您所拥有的完全相同。数组是 CLR 中的一等类型,它们是类型感知的。对于初学者来说,它会有不同的长度。这不是 C。您不只是将指针传递给第一个元素。如果您想编写您所描述的那种低级代码(我不怪您;我也是这样认为的),那么您不应该选择 C#。类型系统“紧身衣”为您提供安全:这一切都是设计使然。你只是不喜欢这个设计。
-
您正试图将 C# 变成一种不同于它试图成为的语言。数组不是 POD 类型。它们是对象,隐式继承自 System.Array。它们是 CLR 中的一等类型,C# 中的任何内容都不会改变这一点。