Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2313516
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-09-08 23:06:41

C/C++ 支持. 在函数内部对变量加上static, 限定该变量的可见性仅限于此一个函数, 但生存期是整个程序的生存期. 在对该函数的多次调用期间其值被保留, 其内存空间分配在数据区. 跟在所有函数外部定义的变量在同一内存区域.

void foo()
{
  static int n_calls = 0;
  printf("you called foo %d times\n", ++n_calls);
}

foo();
foo();
得到的值是不一样的.

可惜, 这在C#中又不支持, 不仅是语言不支持, 而且CLR/IL也不支持, 这导致即使你用IL来写代码也无法做到这一点.

有一种观点认为这种用法是不好的软件工程实践, 但我认为它有自己的用处, 至少它把一个类的静态成员变量封装在了一个函数内部, 往往有这样的情况, 你向类中添加一个静态成员, 其目的仅仅是让它服务于其中一个静态成员函数, 但C#语言却强制你把它声明在更外围的范围内, 这样, 它对所有的成员函数就都是可见的了. 这是一种对静态成员在类内部层次上更小范围的一种数据隐藏.

C#版本升级, 看来没有要把它加入的意思, 语言设计者解释说这样实现起来很困难. 我站着说话不腰痛地说, 能有多困难, 我相信C++编译器比C#编译器难度要大出好几倍. 唉, 只是觉得没这个太可惜了.
阅读(1958) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~