vb.net和C#两兄弟谁的封装性更好?
引言:
虽然没怎样接触过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#两兄弟谁的封装性更好?的更多相关文章
- Dockerfile 中的 CMD和ENTRYPOINT 两兄弟
CMD 先说老大 CMD 当一个容器准备好运行之后,需要找一个指定命令来创建一个初始进程并运行. 一,/bin/sh -c 因为某种意义上一个Dockerfile其实可以理解是一个简化版bash 脚本 ...
- input屏蔽历史记录 ;function($,undefined) 前面的分号是什么用处 JSON 和 JSONP 两兄弟 document.body.scrollTop与document.documentElement.scrollTop兼容 URL中的# 网站性能优化 前端必知的ajax 简单理解同步与异步 那些年,我们被耍过的bug——has
input屏蔽历史记录 设置input的扩展属性autocomplete 为off即可 ;function($,undefined) 前面的分号是什么用处 ;(function($){$.ex ...
- Servlet中分发器和重定向两兄弟
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513702111698485767/ 弄清这个两兄弟,我们还是从练习中去理解 先创建一个数据提交页面,注意路径 编 ...
- JSON 和 JSONP 两兄弟
项目中遇到这个新事物,转一篇不错的总结,原文 如今ajax威风凛凛 但说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决? 这两个问题目前都有不同 ...
- splice和slice这两兄弟为毛这么难记
容易混淆,决定做下笔记!!! splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 语法 arrayObject.splice(index,howmany,item1,....., ...
- leetcode 315. Count of Smaller Numbers After Self 两种思路(欢迎探讨更优解法)
说来惭愧,已经四个月没有切 leetcode 上的题目了. 虽然工作中很少(几乎)没有用到什么高级算法,数据结构,但是我一直坚信 "任何语言都会过时,只有数据结构和算法才能永恒". ...
- 在3D中两条射线的相交性检测
摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\ ...
- javascript中兄弟元素兼容封装
<script> //获取下一个兄弟元素 function getNextElement(element) { if (element.nextElementSibling) { retu ...
- SOA两个接口通常用于实现更:SOAP vs REST
SOA协作架构异构系统,因此,一个跨操作系统的需求.跨语言的通用信息交换格公式. SOAP和REST它们是基于消息正文文本,在跨平台方面相比二进制消息优点.因此,作为选择SOA实施通常用于界面.但SO ...
随机推荐
- 一张图看懂sql的各种join
下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法.
- 前端面试题归类-css的flex相关
Flex布局 常见父项的属性: ●flex-direction :设置主轴的方向 Row 默认值从左到右 row-reverse 从右到左 column 从上到下 column-reverse 从下到 ...
- 使用javafx开发一款桌面个性化软件
本来笔者只是打算开发一个显示在桌面的cpu和内存监控工具,没想到迭代了几次版本之后变成了桌面个性化工具了. 目前实现功能: cpu和内存的实时监控 开机自动启动 自定义logo 自定义主题颜色 鼠标拖 ...
- 使用CSS的clip-path实现图片剪切效果
最近有个业务需求:校对图片文本信息,如下图所示,当鼠标点击文本中某一行的时候,文本上会显示对应行图片同时左侧会显示对应位置的画框. clip-path 今天要说的主题是:如何剪切原图中的部分图片?(前 ...
- centos 安装 部署 gitlab github
https://www.cnblogs.com/wenwei-blog/p/5861450.html 我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 ...
- LeetCode498 对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...
- 机器学习算法·KNN
机器学习算法应用·KNN算法 一.问题描述 验证码目前在互联网上非常常见,从学校的教务系统到12306购票系统,充当着防火墙的功能.但是随着OCR技术的发展,验证码暴露出的安全问题越来越严峻.目前对验 ...
- SpringBoot同时接收单个对象和List<object>参数
最近做项目的有个需求,是把多个文件移动到另一个文件夹下,这需要把 新的文件夹id -- Long类型 多个文件的信息 -- List< Object > 类型 这两个参数传给后台,我的后台 ...
- java调用js代码
jdk8里使用脚本引擎调用js 1.定义一个js方法: function getRouteInfo(province){ //注意,参数不要带var..在java里执行会报错.. if (provin ...
- redis存json数据时选择string还是hash
redis存json数据时选择string还是hash 我们在缓存json数据到redis时经常会面临是选择string类型还是选择hash类型去存储.接下来我从占用空间和IO两方面来分析这两种类型的 ...