我想调用一个可以接受几种不同类型作为可能参数的重载回调方法。
string s = "some text";
PerformCallback(s);
int i = 42;
PerformCallback(i);
byte[] ba = new byte[] { 4, 2 };
PerformCallback(ba);
到目前为止没问题。但现在我想要两种不同的字节数组,让我们称之为蓝字节数组和绿字节数组。字节数组本身就是字节数组。它们的蓝色和绿色只是一个哲学概念,但我想编写一个重载的回调方法,它对两种字节数组有两种不同的重载,以及一种调用两种不同重载的方法。我非常希望避免使用额外的参数来指示字节数组的颜色,我宁愿避免添加一个会增加运行时开销的封闭类或类似的东西。
有什么想法吗?提前谢谢。
答案 0 :(得分:4)
好吧,你可以创建一个只包含一个字节数组的结构,然后可能有{/ 1}}的隐式转换...这样你最终会得到单独的类型过载等等。
因为它是一个结构,在内存方面没有任何开销 - 运行运算符(或只是构造函数)可能会有一个非常轻微的开销,但它至少是很可能 JIT将内联所有内容。我当然不希望它会对性能产生重大影响。
(老实说,你可以把它变成一个封闭的类,除非在紧密循环中使用IMO,否则你仍然不太可能注意到任何差异。性能瓶颈很少出现在我们期望它们的位置。)
答案 1 :(得分:0)
我很困惑,你想区分:
byte[] ba = new byte[] { 4, 2 };
和
byte[] ba = new byte[] { 4, 2 };
如果你没有将它们包装在另一个班级中,那么没有方法可以将它们区分开来? 替代方案是属性,并且会产生非常实际的运行时惩罚,而不像值类包装器所预期的那么小。
如果你真的想要你可以在开头添加一个字节来指示它的颜色,并在你的方法中添加if
吗?
答案 2 :(得分:0)
您的蓝色字节数组和绿色字节数组是相同的类型。避免使用额外的参数等 最好用两种不同的方法对它们进行处理。
PerformCallbackBlue(BA);和PerformCallbackGreen(ba);
原因是你可以更好地考虑架构并使用设计模式f.e. 使用PerformCallback方法获得基础接口,为蓝色和绿色数组获得2个继承类。