as3 for in for each用法

本文详细对比了AS3中Dictionary类与Object的区别。Dictionary允许使用任意数据类型作为键,而非仅限于字符串。此外,还解释了如何使用这些特性进行迭代。

尼玛 for in 是迭代key for each 是迭代 value

AS3中的Dictionary类(flash.utils.Dictionary)是一个新的AS类。Dictionary类和Object唯一的区别在于:Dictionary对象可以使用非字符串作为键值对的键。例如:

var obj:Object = new Object(); 
obj["name"] = 1; // 键是字符串"name" 
obj[1] = 2; // 键是1 (被转换成字符串"1") 
obj[new Object()] = 3; // 键是new Object(),被转传成字符串"[object Object]" 

for (var prop:String in obj) { 
      trace(prop); // 输出:[object Object], 1, name 
      trace(obj[prop]); // 输出:3, 2, 1 
}



也就是说,无论用什么类型的变量作为键,都将被转换成字符串。同时,如果你使用了不同的对象作为键,都会被转换成字符串"[object Object]"作为键,因此而指向了同一个数据。例如:

var a:Object = new Object();    
var b:Object = new Object();    

var obj:Object = new Object();    
obj[a] = 1; // obj["[object Object]"] = 1;    
obj[b] = 2; // obj["[object Object]"] = 2;    

for (var prop:String in obj) {    
      trace(prop); // traces: [object Object]    
      trace(obj[prop]); // traces: 2    
}



Dictionary类将没有这个限制,你可以将键设置成任何一种数据类型。例如:

import flash.utils.Dictionary; 

var a:Object = new Object(); 
var b:Object = new Object(); 

 
dict[a] = 1; // dict[a] = 1; 
dict[b] = 2; // dict[b] = 2; 

for (var prop:* in dict) { 
      trace(prop); // traces: [object Object], [object Object] 
      trace(dict[prop]); // traces: 1, 2 
}



注意:

1、虽然在trace的时候,输出的还是[object Object],但是这个结果是对象的toString的结果。在Dictionary对象中,代表的是不同的对象引用。

2、这里的prop的类型是*。这是很重要的,因为dict对象中的键可能是任何数据类型的。


以下是本人对Dictionary与Object的不同之处的一个小结:


1、Object的键必须是字符串,或表示字符串的表达式(变量或函数),若不是字符串的表达式,则将调用toString()方法,将其转化为字符串;

2、与Object不同的是,Dictionary使用的键是对象的引用,而不是字符串,且非原始对象键调用之前是通过全等运算符(===)来进行判断,并不会将数据类型强制转换之后再进行判断。

但是,对于Dictionary的具体作用还不甚清楚,需要以后进一步研究……

转载于:https://www.cnblogs.com/as3lib/archive/2012/07/13/2590705.html

<think>我们注意到用户提供的引用中包含VB.NET代码片段,特别是关于ForEach循环的使用。用户当前询问的是“vb.netforeachintegerinarraynextusage”,结合之前的对话历史(关于C#的foreach),用户可能在VB.NET中使用ForEach循环时遇到了问题,尤其是在遍历整数数组时如何使用。根据引用[1]和[3]中的代码,我们可以看到VB.NET中ForEach循环的典型用法:-引用[1]:使用For循环(不是ForEach)来初始化文本框数组。-引用[3]:使用ForEach循环遍历NotesDocument中的Items集合。在VB.NET中,遍历数组的ForEach循环基本语法为:```ForEach元素变量In数组&#39;循环体Next[元素变量]```具体到整数数组,我们可以这样写:```vb.netDimnumbers()AsInteger={1,2,3,4,5}ForEachnumAsIntegerInnumbers&#39;使用num,例如:Console.WriteLine(num)Next```注意:1.在循环中,元素变量(如上面的num)是只读的,不能通过它直接修改数组元素。如果需要修改元素,应该使用传统的For循环(基于索引)。2.Next关键字后面可以跟元素变量名,也可以省略。在嵌套循环时建议写上变量名以增加可读性。对比引用[3]的代码:```vb.netForEachitem0Indoc.Itemsi+=1&#39;...其他操作Next&#39;这里没有指定变量名,是允许的```因此,对于整数数组的遍历,我们可以给出如下示例:```vb.net&#39;声明并初始化一个整数数组DimintegerArray()AsInteger={10,20,30,40,50}&#39;使用ForEach循环遍历ForEachnumberAsIntegerInintegerArray&#39;打印每个元素Console.WriteLine(number)Nextnumber&#39;这里明确写上了number,也可以只写Next```常见错误:-在循环体内试图修改循环变量(number)会导致编译错误。-数组未初始化或为Nothing会导致运行时异常。如果需要在遍历过程中修改数组元素,可以使用For循环:```vb.netForindexAsInteger=0TointegerArray.Length-1integerArray(index)=integerArray(index)*2&#39;修改元素Next```最后,根据引用[2],我们注意到在并发环境下修改共享数据(如数组)需要考虑线程安全,但这超出了当前问题的范围。[^1]:引用[1]中的代码展示了For循环的使用,但用户询问的是ForEach。[^2]:引用[2]提到了变量访问的线程安全问题,与循环本身关系不大。[^3]:引用[3]中的代码演示了ForEach循环遍历集合的用法。§§相关问题§§1.如何修改数组元素的值?2.ForEach循环和For循环在VB.NET中的性能差异?3.遍历多维数组时ForEach循环的行为是怎样的?</think> 在 VB.NET 中,`For Each` 循环是遍历数组或集合的高效方式。以下是针对 `Integer` 数组的正确使用方法及注意事项: ### VB.NET 中遍历整数数组的语法 ```vb.net Dim numbers() As Integer = {1, 2, 3, 4, 5} &#39; 声明并初始化整数数组 &#39; 使用 For Each 遍历 For Each num As Integer In numbers &#39; 对每个元素操作 Console.WriteLine($"当前数值: {num}") Next num &#39; 显式指定结束变量名(可选) ``` #### 核心特点: 1. **元素只读性** 循环变量 `num` 是数组元素的副本,修改它不会改变原数组: ```vb.net For Each num As Integer In numbers num = num * 2 &#39; 无效!不会改变原数组 Next ``` 2. **迭代对象约束** 被遍历对象必须实现 `IEnumerable` 接口(数组、List 等自动满足)[^3]。 3. **使用建议** - 循环结束时可以指定变量名(`Next num`)增加可读性 - 避免在循环内修改数组(使用索引式 `For` 循环替代) ### 使用示例:计算数组总和 ```vb.net Dim values() As Integer = {10, 20, 30, 40} Dim total As Integer = 0 For Each value As Integer In values total += value &#39; 正确:读取原始值 &#39; value = 0 &#39; 错误:禁止修改 Next Console.WriteLine($"总和: {total}") &#39; 输出:总和:100 ``` ### 与 `For` 循环的关键区别 | 特性 | `For Each` 循环 | 传统 `For` 循环 | |--------------|-----------------------------|---------------------------| | 需要索引 | 否 | 是 | | 元素可修改性 | 只读 | 可读写 | | 迭代范围控制 | 自动遍历所有元素 | 需手动指定范围 | | 适用对象 | 所有实现 `IEnumerable` 的类型 | 需支持索引访问的类型 | > 注:根据引用[2],在并发环境中操作共享数组时,建议使用同步锁(但会降低性能)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值