就我们上一篇文章不是说了 C++是按文件编译的 那为什么C#就没有文件的概念了也没有头文件和源文件的概念
只有.cs呢?
可以理解为头文件 源文件都在.cs中
需要引用的类和函数一定要放在自己的前面的这种设定本来就是低内存时代的产物,在现在牛逼的机器上面只有坏处没有好处。
“和分配内存无关。
这么设计只是为了防呆。和C/C++不同,C#在语法上有很多防呆的设计。
这就好比USB反过来插不进去,不是因为它的金属端口不匹配——你把那个东西破坏了可以插进去,但是会烧坏电脑。
一样的道理,你定义一个变量而不初始化,C允许你这么做,但是这会导致程序出现潜在的bug。
C#的设计者干脆让编译器限制你这么写。”
“作为一个程序员,你应该为编译器的防呆设计而感到愉悦。
就像我说了,一个插头的几何外形被故意设计成反向无法插入,你不会抱怨这种设计的不灵活性,而是会感谢正是这样的设计的存在,使得你不用看说明书,不用判别插头每个管脚、连线的作用就可以放心地使用,不用担心会出什么状况。
一样的道理,使用变量就应该先初始化。而不是总想着省那么几个字母而给程序带来隐患。 ”
“我可以举出很多C#的防呆设计,比如在C++中
if (i == 10)
经常会被误写成
if (i = 10)
尽管这个表达式可以通过编译,但是绝大部分情况下这都不是程序员的本意。
更有甚者
int * p = &i;
if (p = NULL)
{
...
}
这个倒霉的表达式会将p置为野指针,从而导致很严重的问题。
在C#中,if (i = 10)是不允许的。
这丝毫不会影响真正想这么写的程序员。
他完全可以写
i = 10;
if (i <> 0) ...
类似的switch ... case分支中,忘记写break导致的分支穿透也是造成bug的原因。
C#不允许非空的case分支不加break。
对于指针,C#更是不允许使用——除非你用unsafe显式地表明你需要用它。
”