在VB.NET中创建一个空数组的建议方法是什么?

15

在VB.NET中,如何最好地处理数组,使它既可以为Nothing,又可以初始化并设置长度为零?

我能想到的三种选择是:

ReDim oBytes(-1)

oBytes = New Byte(-1) {}

oBytes = New Byte() {}

我们公司的大多数开发人员(我们以前使用VB 6)都使用第一个示例。我个人更喜欢第三个示例,因为它最容易理解正在发生的事情。

那么每种方法(选项2和3非常相似)的优缺点是什么?


编辑
那么,有没有人知道避免ReDim的理由,除了它是VB时代的遗物之外?

如果这是所有人所拥有的答案,那么我也会接受!


回答已编辑以提供更多避免使用它的理由 - Adam Robinson
1个回答

16

我建议使用:oBytes = New Byte() {}

你应该尽量避免"经典VB语法",如Redim和其他来自经典VB时代的过时语法。我建议选择第三个选项。

编辑

为了提供更多关于避免使用它的信息,请参见此MSDN页面。虽然该页面没有明确建议不使用它,但可以看出Redim存在缺点(以及可能引起混淆),而其他语法则没有这种问题。

  1. Redim只能用于已存在的数组。即使如此,它在语义上等同于声明一个new数组。 Redim释放旧数组并创建新数组(因此它不能像Redim那样具有“添加”或“删除”元素的能力)。此外,如果没有使用Preserve关键字,则会对其进行破坏性操作,即使没有视觉提示表明正在进行赋值。
  2. 由于Redim无法创建数组(但只能处理现有数组),因此它只能在过程内使用。在类级别上,你必须使用New Byte() {}方法,留下两种视觉上不同的为新数组赋值方式,尽管它们在语义上是相同的。

是的,我同意,这就引发了这个问题,我倾向于在发现它们时删除旧的VB代码! - stevehipwell
2
我非常赞同。"ReDim"和"New Byte(-1)"看起来就是错的。在我看来,它看起来像是在说ReDim oBytes(-1到0),这看起来应该会给出一个包含两个元素的数组(在Vb6中确实如此)。拜托了,请世界上的人们假装VB.net之前没有VB存在好吗?拜托了? - Binary Worrier
@Binary Worrier - 我完全同意你的观点!这正是导致大多数VB.NET可用性问题的原因! - stevehipwell
@AdamRobinson 太棒了。我完全同意。但是,你如何使空数组增长?使用List每次转换为Array吗?当您的数组是不可变的时,这是正确的方法。问题是:您总是想要它吗?在执行过程性任务之前,您无法始终知道数组的大小;即使您可以,由于大小预检查,大多数情况下性能也不会提高。换句话说:pushpopswitchunswitch应该是本机类Array的方法。这怎么可能是向后不兼容或影响性能的呢? - rellampec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接