从封装性来分析vb.net和C#两兄弟的差异

2024-06-10 03:58

本文主要是介绍从封装性来分析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#两兄弟的差异的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047153

相关文章

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言

axios全局封装AbortController取消重复请求

为什么? 问题:为什么axios要配置AbortController?防抖节流不行吗? 分析: 防抖节流本质上是用延时器来操作请求的。防抖是判断延时器是否存在,如果存在,清除延时器,重新开启一个延时器,只执行最后一次请求。节流呢,是判断延时器是否存在,如果存在,直接return掉,直到执行完这个延时器。事实上,这些体验感都不算友好,因为对于用户来说,得等一些时间,尤其是首次请求,不是那么流畅

Python利用qq邮箱发送通知邮件(已封装成model)

因为经常喜欢写一些脚本、爬虫之类的东西,有需要通知的时候,总是苦于没有太好的通知方式,虽然邮件相对于微信、短信来说,接收性差了一些,但毕竟免费,而且支持html直接渲染,所以,折腾了一个可以直接使用的sendemail模块。这里主要应用的是QQ发邮件,微信关注QQ邮箱后,也可以实时的接收到消息,肾好! 好了,废话不多说,直接上代码。 # encoding: utf-8import lo

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式,用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性,可以处理各种HTTP请求,并支持各种数据格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(ActionMethods)的概念、通过路由配置将请求映射到相应的方法上。 开发人员可以使用各种属性和过滤器来处