辨析Empty,Null和Nothing

VBA中Empty、Null与Nothing详解
本文详细解析了VBA中Empty、Null和Nothing的区别及应用场景,介绍了它们如何用于Variant变量,以及如何利用这些特性进行有效的编程实践。

<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

 

 辨析Empty,Null和Nothing

              原文来自:billj的专栏      

在VBA中变量一般都是强类型的,即总声明成Integer,Long,Single,Double,String或Date等类型,这些强类型的值毋需考虑Empty、Null和Nothing。

有时我们需要定义一种能包含所有类型的变量,这种类型就是Variant,它是一种特殊的数据类型,可以包含数值、字符串或日期数据,还包含自定义 类型、对象(Object)和特殊数值Empty、Nothing和Null。对所有变量,如果没有明确声明它们是其它数据类型,则它们都变成 Variant 数据类型。因此Empty和Null只有对Variant变量才有意义。

对于Empty、Nothing和Null,你都要知道,他们都是值,可以赋给Variant变量

作为声明为Variant变量,如

 Dim vnt as Variant

vnt只进行了声明未赋值,其值就是Empty(由系统自动赋予),表示vnt只是声明了但尚未初始化(即尚未通过程序赋值)。这是因为Variant可以是任何类型的值,但在初始化前无法确定实际的类型而不能给出符合类型的形式(如数值型的0或字符串型的"")。

对于赋予Empty的Variant型变量,Empty是个有效数据(可以称为万能值),因为如果你认为这是数值型则值是0,认为是字符串型则值是""(空串)。所以以下的比较将是为真的

 If vnt = 0 Then  或 if vnt = "" Then 或 If IsEmpty(vnt) Then

上面所述的数值、字符串或Empty都是有效数据,而当你将Null赋予vnt,如

 vnt = null

则表示vnt不包含有效数据。对于值为Null的数据只是通过IsNull函数来判断。那什么时候要用Null呢?比如对于性别,有效数据只能是男或女,但没填算什么,就是无效数据嘛!可以用Null来表示。

声明为Variant变量有一种叫对象变量。Nothing就是为对象变量赋值的,如

 Set vnt = Nothing

对象变量使用时总指向一个对象,对象需要占用较大的内存资源,用完应该尽快释放。将对象变量设为Nothing就是通知系统对象变量不再使用那个对象,当那个对象没有任何对象变量再使用它后,系统便会释放该对象所占的内存资源。

总结
----
Empty、Null和Nothing都可为Variant变量赋值,声明时系统会设Variant变量为Empty,如果要将Variant变量设为无效数据可用Null,如果不再使用对象变量就应尽快将之设成Nothing以利系统释放资源。

 

### 机器周期与存储周期的区别 在计算机体系结构中,**机器周期****存储周期**是两个不同的时间单位,分别用于描述 CPU 操作主存操作的时间长度。 #### 机器周期(Machine Cycle) 机器周期是 CPU 执行一个基本操作所需的时间,通常用于管理指令执行过程中的各个阶段。例如,取指令、执行指令、访问内存等操作都可以被划分为多个机器周期。每个机器周期由多个时钟周期组成,具体数量取决于 CPU 的设计操作的复杂性。在某些情况下,一个机器周期可能包含多个状态周期(S 周期),用于完成特定的 CPU 内部操作[^1]。 例如,取指令阶段可能需要一个机器周期,而执行阶段可能需要另一个机器周期。因此,一个完整的指令周期通常由多个机器周期组成[^2]。 #### 存储周期(Memory Cycle) 存储周期是指主存(RAM)完成一次读或写操作所需的时间。它包括从地址被送到内存地址总线开始,到数据被成功读出或写入内存为止的整个过程。存储周期通常比机器周期长,因为它涉及到内存访问的物理延迟。在某些体系结构中,存储周期可能与机器周期不一致,尤其是在需要多次访问内存的情况下[^3]。 例如,如果指令字长是存储字长的两倍,则需要两次访存操作,因此需要两个存储周期[^3]。 #### 总结区别 | 特性 | 机器周期 | 存储周期 | |------|-----------|------------| | 定义 | CPU 执行一个基本操作所需的时间 | 主存完成一次读/写操作所需的时间 | | 涉及对象 | CPU 内部操作 | 主存访问操作 | | 组成 | 多个时钟周期 | 多个时钟周期(通常比机器周期长) | | 应用场景 | 指令执行的各个阶段(如取指、执行) | 内存读写操作 | ### 示例代码:模拟机器周期与存储周期 以下是一个简单的 Python 模拟程序,用于演示机器周期存储周期的概念: ```python class CPUSimulator: def __init__(self, clock_cycle): self.clock_cycle = clock_cycle # 时钟周期时间(单位:ns) def machine_cycle(self, cycles): """模拟一个机器周期""" return cycles * self.clock_cycle # 机器周期 = 若干时钟周期 def memory_cycle(self, cycles): """模拟一个存储周期""" return cycles * self.clock_cycle * 2 # 存储周期通常比机器周期长 # 假设时钟周期为 1ns simulator = CPUSimulator(clock_cycle=1) # 模拟一个机器周期为 4 个时钟周期 print(f"机器周期耗时:{simulator.machine_cycle(4)} ns") # 模拟一个存储周期为 6 个时钟周期 print(f"存储周期耗时:{simulator.memory_cycle(6)} ns") ``` 输出结果: ``` 机器周期耗时:4 ns 存储周期耗时:12 ns ``` 该示例展示了机器周期存储周期的时间计算方式,其中存储周期通常比机器周期更长。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值