【问题标题】:Assign byte, UInt16 and UInt32 data types to Object data type in C#在 C# 中将字节、UInt16 和 UInt32 数据类型分配给 Object 数据类型
【发布时间】:2013-12-24 22:21:26
【问题描述】:

根据this MSDN 链接,Object 数据类型可以指向任何数据类型。但是,这样做时出现错误。我的代码如下。

public bool Write(Object[] data, UInt32 numData)
{
   // Code
}

测试Write API的代码如下:

byte[] writeBuffer = new byte[256];
Random rnd = new Random();
UInt32 size = 256;
rnd.NextBytes(writeBuffer);
data.Write(writeBuffer, size);

这里的 writeBuffer 是一个字节数组,但也可以是 UInt16 或 UInt32 数组。我在 data.Write 行中收到一个错误,提示存在 invalid arguments

请告诉我问题是什么。

编辑 1: 我的应用程序提供了一个“写入”API,它可以采用字节、UInt16 或 UInt32 类型的数组。根据数据类型(在创建对象时设置),API 在内部将 UInt16 和 UInt32 转换为字节数组并将其传递给底层。顺便说一句,这是 .Net 微框架,其中 API 下面的层是本机 c++ 代码。

谢谢。

【问题讨论】:

    标签: c#


    【解决方案1】:

    没有任何东西“指向”那里的任何东西,不涉及指针,大多数(不是所有)类型都从对象继承,但这并不意味着某个东西的数组继承自一个对象数组,它只是意味着数组中的元素对象可以是任何东西。

    .Write 需要一个对象数组,而您要传入一个字节数组,它不起作用。您必须将元素 1 逐 1 设置(因为单个字节是一个对象,因此可以将其存储在 object[] 中)

    但是,当我回答这个问题时,问题本身可能隐藏了一些糟糕的设计,你为什么要这样做?您能否向我们展示您的功能用例,以便我们提出替代方案?大多数情况下,如果您直接使用对象或对象集合,那么您就做错了。

    【讨论】:

    • 这是设计。我的应用程序提供了一个“写入”API,它可以采用字节、UInt16 或 UInt32 类型的数组。根据数据类型(在创建对象时设置),API 在内部将 UInt16 和 UInt32 转换为字节数组并将其传递给底层。顺便说一句,这是 .Net 微框架,其中 API 下面的层是本机 c++ 代码。很抱歉错过了这个细节。
    • 为什么要打扰object[]?正如罗曼所说,这行不通。 Array 可以工作,但是您必须检查它是什么类型的数组,然后抛出异常等。如果您只需要这三个选项,请考虑创建 Write 的三个重载,采用 byte[]ushort[]uint[].
    【解决方案2】:

    您需要将 byte[] 转换为对象数组,例如:

    writeBuffer.Select(c=>(object)c).ToArray()
    

    请注意,这称为“装箱”,会产生性能成本,如果可能,请继续使用 byte[]。

    【讨论】:

      【解决方案3】:

      通过使用这样的 Write 通用定义来避免 装箱 惩罚:

      public bool Write<T>(T[] data, UInt32 size) {
        // Code
      }
      

      并像这样调用它:

      data.Write(writeBuffer, size);
      

      在大多数情况下,如上所述,C# 编译器将能够自动确定要为 T 推断的正确类型,尽管您可以在必要时在调用期间指定它,如下所示:

      UInt32[] uint32Array;
      // :
      data.Write<UInt32>(uint32Array, (UInt32)uint32Array.Count());
      

      【讨论】:

        猜你喜欢
        • 2023-02-10
        • 2012-03-26
        • 2012-08-24
        • 2021-06-08
        • 2020-06-24
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 2023-02-18
        相关资源
        最近更新 更多