引言:
虽然没怎样接触过vb.net,但是大概对于vb6还是比较了解的。前者是从后者基础上发展而来的。后来接触了C#编程语言,起初没有太关心她和vb.net有啥不同的地方,话说都是面向对象的,而且都是MS帝国的产品。一直觉得没什么区别,直到昨天的下午……我才发现这样一个吊炸天的问题……原来vb.net她……竟然……
最近看一些博客发现,也发一些vb6.0论坛,vb.net论坛等比较冷清,更多的人从过去的vb6.0和vb.net选择转向了C#……刚好也和我昨天的发现不谋而合。
下面是我的一点小小的发现,或许很多人会说这个没什么,而且是非常基础的东西。有什么必要拿出来讲呢?恰恰就是这样的一个基础的东西引发了我的一连串思考……这件事儿还得从一个New字说起………
相关知识:
用New出来的对象在内存中的堆区,而直接用类名来定义的对象是在栈区。那么什么是堆栈呢?据我了解到的大概有两个意思,
1、数据结构:在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。
2、存储区:在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。要点:堆,列队优先,先进先出。栈,先进后出(First-In/Last-Out)。
小结:
所以,相关知识中的所谓的堆栈就是指存储区。对于堆栈作为存储区,有个经典的比喻:栈就像是我们去饭店吃饭,吃完就走人不用收拾,自然有人替你收拾好(用完立即自动释放)。堆区的东西,也就四我们new出来的东东,就需要我们自己来管了,就像是在自己家里做饭吃,搞完还得记得自己清理垃圾(手动释放内存资源)。不过还好现在都有垃圾处理机制了,长时间不用的话,会有专门的算法来自动清理的。
关于具体什么是堆和栈请参考博客:《堆栈——详细分析》
小试验:关于vb.net和C#对于类的封装性的一个测试,分别在两种编程语言环境下建立了两个一样的解决方案:都是在form1中取访问form2中的成员(均为public成员)。试验的一些条件如下:
1、都在一个命名空间下,处于同一程序集中。
2、两个解决方案的编程语言环境分别是:vs2013旗舰版中的vb.net环境和C#环境
3、被访问的form2的成员均为Public关键字修饰
分了如下两种情况进行的。
情况一:不实例化对象,直接访问。
1.1(vb.net环境下效果图)
1.2(C#环境中效果图)
结论:在vb.net编程环境中,不用实例化即可访问其他的类中的Public、friend成员。在vb.net环境中form2即是类又是对象,因此可以对类的成员直接进行操作。C#中在不实例化的情况下,无法访问同一程序集统一命名空间下的类中的任何成员。
情况二:实例化对象后再访问。
1.1(vb.net)
1.2( C# 环境中)
结论:通过实例化出一个form2对象之后再访问,无论是vb.net还是C#下,都可以在form1通过实例化出来的对象来访问form2中的任意被public或者friend修饰的成员。
其他发现:
1、vb.net和C#的访问修饰符对照图(他们是一一对应的关系,其修饰的效果是一样的只是单词表示不一样而已)
2、助记图C#访问修饰符
小结:
1、实例化一个对象操作有什么好处?
参考答案:灵活、安全、随时用随时new,不需要占用系统的宝贵内存空间。因为实例化出来的对象其实是相当于类的一个镜像。从面向对象的角度来说:一个包装好了的功能的代码块就可以作为一个类。但你不能直接用它,因为面向对象概念中是不允许随便修改类的内容的,这就是面向对象的封装性。要用你就要实例化。就像汽车这个类。你要用行,但你不能改了汽车的一些基本性质上的东西。比如你不能让四个轮子变成只有两个。你不能去掉方向盘。但是你不甘心啊,所以你实例化了,系统就给你一个类似于汽车镜像一样的汽车,他有了汽车通有的东西。你自己给他一个名字,以后你就可以随意让车开开停停,改改装装,你说我要加一排灯行,你可以加在你的实例上,但不要加到类上,因为你一加到类上了,别人实例化了的汽车也有一排的灯了,人家又不喜欢怎么办呢。
那么细心的童鞋就会问了,那么在vb.net中我们并没有实例化对象,但是也可以访问其他类的成员啊!?这样岂不是更灵活?好了,这就是我想说的啦,这样对于类来说,这样的灵活带来的代价是不安全的!而且是破坏了类的封装性。
在vb.net中,即使没有实例化也一直都存有form2对象,这样是比较消耗系统资源的。而且在vb.net中我发现,在form对象实例化和定义其成员的时候默认是用friend来修饰的哦!
因为friend修饰,意味着在同一程序集中可以被同一程序集中任意其他的类来访问。这样的话,确实是挺省事儿不用实例化了,但是也是相当的不安全哦。一不小心人家就把你的车子给改造了,卸个螺丝,丢个胎啥的。那么这个类不就完蛋了吗?
总结:
虽然vb.net和C#都是MS帝国的产品,也都是完全面向对象的编程语言。但是从以上试验数据来看,C#相对来说对于面向对象的支持更加严格一些,比如:区分大小写,再比如:类的封装性。这样的话,C#相对就更加安全一些。而且,现在人们对于网络的需求的日益增大,使得C#编程语言的优势愈发的明显,她还具有运算符重载的功能,这将使得一些复杂的运算问题变得极为简单,而且这是vb所不具有的。C#还支持跨平台,哇哦……太多的好处了!而且从一些资料和现象来看,MS帝国也是更多的倾向于C#这一边,所以在大家对于vb.net和vb6.0的社区的冷清就一点也不奇怪了