代码之家  ›  专栏  ›  技术社区  ›  RenniePet

是否可以在C_中为字节数组设置一个“别名”?

c#
  •  2
  • RenniePet  · 技术社区  · 14 年前

    我想调用一个重载回调方法,它可以接受几个不同的类型作为可能的参数。

    string s = "some text";
    PerformCallback(s);
    
    int i = 42;
    PerformCallback(i);
    
    byte[] ba = new byte[] { 4, 2 };
    PerformCallback(ba);
    

    到目前为止没问题。但是现在我想要两种不同类型的字节数组,让我们称它们为蓝字节数组和绿字节数组。字节数组本身就是字节数组。它们的Blueness和Greeness只是一个哲学概念,但我想编写一个重载回调方法,它为两种字节数组提供两种不同的重载,以及调用两种不同重载的方法。我非常喜欢避免使用一个额外的参数来指示字节数组的颜色,并且我更喜欢避免任何添加封闭类或类似的东西,这些东西会增加运行时开销。

    有什么想法吗?事先谢谢。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    你可以创建一个结构 只是 包含一个字节数组,然后可能进行隐式的到/从转换 byte[] …这样,为了重载等,您最终会得到不同的类型。

    因为它是一个结构,所以在内存方面没有开销——很可能有一个 非常轻微 运行操作符(或只是构造函数)所涉及的开销,但至少 可能的 不管怎样,JIT都会把所有的东西都列起来检查。我当然不会期望它对性能有重大影响。

    (老实说,您可以将其设置为一个封闭类,而且您仍然不太可能注意到任何区别,除非在imo的紧循环中使用了这种方法。性能瓶颈很少出现在我们期望的地方。)

        2
  •  0
  •   Matt Mitchell    14 年前

    我很困惑,你想区分一下:

    byte[] ba = new byte[] { 4, 2 }; 
    

    byte[]ba=新字节[]4,2
    

    ?

    如果你不把它们包装在一个不同的类中, 如何区分它们? 另一种选择是属性,它将具有非常真实的运行时惩罚,而不像值类包装器预期的那么小。

    如果你真的想要的话,你可以在开头加一个字节来表示它的颜色和 if 你的方法是这样的,对吗?

        3
  •  0
  •   Arseny    14 年前

    蓝色字节数组和绿色字节数组的类型相同。避免使用额外的参数等等 最好用两种不同的方法来控制它们。

    performcallblue(ba);和performcallbackgreen(ba);

    因为您可以更好地考虑架构并使用disign模式f.e。 获取带有PerformCallback方法的基推断,以及蓝色和绿色数组的2个继承类。