引言:

虽然没怎样接触过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的社区的冷清就一点也不奇怪了

vb.net和C#两兄弟谁的封装性更好?的更多相关文章

  1. Dockerfile 中的 CMD和ENTRYPOINT 两兄弟

    CMD 先说老大 CMD 当一个容器准备好运行之后,需要找一个指定命令来创建一个初始进程并运行. 一,/bin/sh -c 因为某种意义上一个Dockerfile其实可以理解是一个简化版bash 脚本 ...

  2. input屏蔽历史记录 ;function($,undefined) 前面的分号是什么用处 JSON 和 JSONP 两兄弟 document.body.scrollTop与document.documentElement.scrollTop兼容 URL中的# 网站性能优化 前端必知的ajax 简单理解同步与异步 那些年,我们被耍过的bug——has

    input屏蔽历史记录   设置input的扩展属性autocomplete 为off即可 ;function($,undefined) 前面的分号是什么用处   ;(function($){$.ex ...

  3. Servlet中分发器和重定向两兄弟

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513702111698485767/ 弄清这个两兄弟,我们还是从练习中去理解 先创建一个数据提交页面,注意路径 编 ...

  4. JSON 和 JSONP 两兄弟

    项目中遇到这个新事物,转一篇不错的总结,原文 如今ajax威风凛凛 但说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决? 这两个问题目前都有不同 ...

  5. splice和slice这两兄弟为毛这么难记

    容易混淆,决定做下笔记!!! splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 语法 arrayObject.splice(index,howmany,item1,....., ...

  6. leetcode 315. Count of Smaller Numbers After Self 两种思路(欢迎探讨更优解法)

    说来惭愧,已经四个月没有切 leetcode 上的题目了. 虽然工作中很少(几乎)没有用到什么高级算法,数据结构,但是我一直坚信 "任何语言都会过时,只有数据结构和算法才能永恒". ...

  7. 在3D中两条射线的相交性检测

    摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\ ...

  8. javascript中兄弟元素兼容封装

    <script> //获取下一个兄弟元素 function getNextElement(element) { if (element.nextElementSibling) { retu ...

  9. SOA两个接口通常用于实现更:SOAP vs REST

    SOA协作架构异构系统,因此,一个跨操作系统的需求.跨语言的通用信息交换格公式. SOAP和REST它们是基于消息正文文本,在跨平台方面相比二进制消息优点.因此,作为选择SOA实施通常用于界面.但SO ...

随机推荐

  1. JAVA_基础IO流对象流(三)

    处理流:对象流 ObjectInputStream和OjbectOutputSteam用于存储和读取基本数据类型数据或对象的处理流.可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来. ...

  2. 设计模式之SOLID原则

    介绍 设计模式中的SOLID原则,分别是单一原则.开闭原则.里氏替换原则.接口隔离原则.依赖倒置原则.前辈们总结出来的,遵循五大原则可以使程序解决紧耦合,更加健壮. SRP 单一责任原则 OCP 开放 ...

  3. linux下hue的安装与部署

    一.Hue 简介 Hue是一个开源的Apache Hadoop UI系统,最早是由Cloudera Desktop演化而来,由Cloudera贡献给开源社区,它是基于Python Web框架Djang ...

  4. docker nginx 自定义配置容器

    准备 拉取nginx官方镜像 docker pull nginx etc/nginx/ 下新建目录 cert 和 conf cert 存放证书 conf 存放配置文件 mkdir /etc/nginx ...

  5. Es5数组新增的方法及用法

    1.forEachforEach是Array新方法中最基本的一个,就是遍历,循环.例如下面这个例子: [1, 2 ,3, 4].forEach(alert);等同于下面这个传统的for循环: var ...

  6. 在阿里云托管的k8s上使用nas做动态存储

    前言 关于aliyun托管k8s的存储插件主要有两种: CSI # kubectl get pod -n kube-system | grep csi-plugin csi-plugin-8bbnw ...

  7. Spring框架之websocket源码完全解析

    Spring框架之websocket源码完全解析 Spring框架从4.0版开始支持WebSocket,先简单介绍WebSocket协议(详细介绍参见"WebSocket协议中文版" ...

  8. APPIUM-Android自动化元素定位方式

    一.常用元素定位方法 appium从selenium中继承了所有的元素定位方法, 并且增加了一些自己的元素定位方式,下方截图分别为selenium和MobileBy包源码: 但是从继承selenium ...

  9. mysql中的基本注入函数

    1. 常见数据库注入函数: MYSQL: and length((user))>10 ACCESS: and (select count() from MSysAccessObject)> ...

  10. 【Java】面向对象

    重新搞一波 复习巩固 简单记录 慕课网 imooc Java 零基础入门-Java面向对象-面向对象 都是视频课件里的. 文章目录 面向对象 什么是对象 什么是面向对象 类 什么是对象的属性和方法 类 ...