引言:

虽然没怎样接触过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. 对CROS OPTIONS预检请求的一些思考

    前后端分离模大势所趋,跨域问题更是老生常谈. 问题背景: 浏览器最基本的安全规范-同源策略.所谓同源是指域名.协议.端口相同.不同源的浏览器脚本(javascript.ActionScript.can ...

  2. win7-win10 禁用IPV6临时地址

    IPV6临时地址本意是保护设备隐私,但有时候需要暂时禁用的情景下指令 netsh interface ipv6 set privacy state=disable 启用则修改最后的状态值为enable ...

  3. MySQL在按照某个字段分组、排序加序号

    事情是这样的,最近领导给了一个新的需求,要求在一张订单表中统计每个人第一次和第二次购买的时间间隔,最后还需要按照间隔统计计数,求出中位数等数据. 由于MySQL不想Oracle那般支持行号.中位数等, ...

  4. Spring--AOP、通知的执行顺序

    AOP执行顺序 如果我们在同一个方法自定义多个AOP,我们如何指定他们的执行顺序呢? 可以通过指定order,order越小越是最先执行. 配置AOP执行顺序的三种方式: 通过实现Ordered接口 ...

  5. PHP 获取天气

    /** * 获取天气 */ function get_tq () { //获取用户ip地址 $ip = get_real_ip(); // $ip = '123.125.71.38'; //根据ip地 ...

  6. 废弃fastjson!大型项目迁移Gson保姆级攻略

    前言 大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀. 在被大家取关之前,我立下一个"远大的理想",一定要在这周更新文章.现在看来,flag有用了... 本篇文章是我这一个多月 ...

  7. pthread 读写锁

    pthread 读写锁 (Read Write Lock, rwlock) 把对共享资源的访问者分为读者和写者,读者仅仅对共享资源进行读访问,写者仅仅对共享资源进行写操作. 如果使用互斥量 mutex ...

  8. JVM故障处理工具,使用总结

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 用都用不到怎么学? 没有场景.没有诉求,怎么学习这些似乎用不上知识点. 其实最好的方 ...

  9. Ocelot一个优秀的.NET API网关框架

    1 什么是Ocelot? Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fab ...

  10. 你必须要懂的 Github 开源协议

    作为一个开源社区的活跃者,那些开源协议你都懂什么意思吗? 列两个: Apache License 可以: 商用.修改.分发 但是要声明作者来源和你的修改以及协议 MIT  License 只要声明版权 ...