首页 新闻 赞助 找找看

C#如何实现类似C/C++中的const 数组

0
悬赏园豆:10 [已关闭问题] 关闭于 2011-11-16 14:13

这个问题困恼本人一个多星期了,在此恳请高手指点,万分感谢!

 

在嵌入式开发中,时常把常量数据块以const数组形式呈现。当打包进嵌入式设备时会自动把这部分常量数据存放到Data Rom中,程序读取时直接映射到这部分空间地址就行了。

例如:

const unsigned long c_DataArray[] = {
0x00646e65,0x00000505,0x00005cc0,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00001dc9, ...};

在大多数嵌入式设备上,在样做既可以节省Ram空间,也可以减少读取IO负担(如果换做都去文件形式),速度也得到了保证。

但是,本人在切换到C#实现时,不知道如何实现能到到C/C++ const 数组一样的效果。

有些网友建议尝试使用readonly,或fixed空间,但是这依然不能达到我的目的。

问题补充:

我的目的是为了实现一个引擎库,考量到将来要移植到Win Phone设备上,但是就目前本人得到的信息,Win Phone第三方应用软件还无法加载非托管Assembly,所以必须要用C#实现。

恳请哪位高人抽空指导一下,谢谢!

胡屯的主页 胡屯 | 小虾三级 | 园豆:714
提问于:2011-10-31 17:41
< >
分享
所有回答(3)
0

由于数组是引用类型,而const要求提供一个编译期常量,引用类型的编译期常量就只有null了。因此这里毫无办法,只能用readonly关键字。你的代码用C#表达是这样的:

readonly ulong[] Data = new[] { 0x00646e65UL,0x00000505UL,0x00005cc0UL,0x00000000UL };

我不知道为何这样“依然不能达到你的目的”,在我看来const需要的它都能做到,而且性能上也没有任何问题。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-10-31 18:21

感谢大家的回复。

readonly ulong[] Data = new[] { 0x00646e65UL,0x00000505UL,0x00005cc0UL,0x00000000UL };

这里数组引用是readonly,但是数组元素仍是引用类型,可以重定向为别的对象。

以以下代码:

ulong temp = 0;
Data[0] = temp;

 

而且在C/C++中,const 数组是静态编译是就确定了数组的位子,而在C#在CLR环境中会有动态加载的负担(弱弱的,不是很确定)。

总之,“依然不能达到你的目的":(


支持(0) 反对(0) 胡屯 | 园豆:714 (小虾三级) | 2011-11-01 11:18

@hutun: 那你可以使用ReadOnlyCollection<T>

readonly ReadOnlyCollection<ulong> Data = new ReadOnlyCollection<ulong>(new[] { 0x00646e65UL, 0x00000505UL, 0x00005cc0UL, 0x00000000UL });

这样你给Data[0]赋值就会编译报错了。但是确实不能像C++那样做到编译时就确定空间地址。

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2011-11-01 13:17
0

同楼上一样不明白为何“依然不能达到你的目的”。。。

顾晓北 | 园豆:10844 (专家六级) | 2011-11-01 09:58
0

如果是.net4.0以上版本,可以尝试一下代码契约

ceezoo | 园豆:202 (菜鸟二级) | 2013-03-28 00:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册