装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

工具

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

广告



访客

 

最近VB FAQ提到了一个问题——VB.NET支持非零下标数组吗?答案是不支持。即使VB2005有这样的语法Dim a(0 To 10) As String,那个“0”也不能是别的数字。CLR在某种程度上支持非零下标数组,但C#这样有C传统的语言一开始就设计成只支持零下标,如果VB支持非零下标数组,各种语言的交互将会变得困难。关于这个问题,详细讨论请见这里。在FAQ中,另一篇帖子讨论了解决方法,就是用一个类模拟数组的行为,用默认属性(或索引器,C#)来模拟数组的下标。但是原文提到,没有泛型的情况下,我们需要为每一种类型创建一个非零下标的数组类。现在我们不但有了泛型,还有运算符重载,可以做一个更加清晰、漂亮的非零下标数组类。在动手以前,我发现C#还支持迭代器,可以令我的类更加方便,于是就用了C#,后面给出VB调用它的例子。

/// <summary>
/// 表示一个下标可以不是零的数组
///
</summary>
///
<typeparam name="T">数组元素的类型</typeparam>
public class VBArray<T> : IEnumerable<T>
{
    private T[] arr;
    private int _LBound;

    public int LBound
    {
        get
        {
            return _LBound;
        }
    }

    public int UBound
    {
        get
        {
            return _LBound + arr.Length - 1;
        }
    }

    public VBArray(int LBound, int UBound)
    {
        if (UBound < LBound)
        {
            throw new ArgumentException("上界不能小于下界");
        }
        _LBound = LBound;
        arr = new T[UBound - LBound + 1];
    }

    public T this[int index]
    {
        get
        {
            return arr[index - _LBound];
        }
        set
        {
            arr[index - _LBound] = value;
        }
    }

    public void ReDim(int UBound)
    {
        if (UBound < _LBound)
        {
            throw new ArgumentException("上界不能小于下界");
        }
        arr = new T[UBound - _LBound + 1];
    }

    public static implicit operator T[](VBArray<T> vbarr)
    {
        return vbarr.arr;
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (int i = 0; i < arr.Length; i++)
        {
            yield return arr[i];
        }
    }

}

以下代码为VB调用该类的例子。

Dim o As New VBArray(Of Integer)(3, 15)

o(3) = 5
o(4) = 6
o(10) = 10
o(15) = -1

MsgBox(o(10))

For Each x As Int32 In o
    MsgBox女孩
Next

通过重载的运算符,可以将VBArray转换为普通的数组,这样就可以在需要操作数组的上下文使用VBArray中的数值。


随贴广告(测试期)
相关文章

打印 | 张贴于 2004-04-30 13:20:00 | Tag:技术随笔

留言反馈

re: 实现一个非零下标数组 编辑
好东东
2004-11-01 15:20:00 | [匿名用户:beautyispower]
回复: 实现一个非零下标数组 编辑
的确有办法实现非零下界,我前面也有提到(CLR支持非零下界数组),但是VB.NET和C#都没有语法支持它
2004-05-14 10:45:00 | [匿名用户:Ninputer]
回复: 实现一个非零下标数组 编辑
我记得好像是有办法实现非零下标的数组的,只不过那就会使得程序不是CLS-Compatible了。不知道我有没有记错。
2004-05-12 10:54:00 | [匿名用户:sumtec]
回复: 实现一个非零下标数组 编辑
有时候有特殊需要呀,比如说希望将1997-2004年的销售额做一个数组,那么下标从1997到2004最直观了。
2004-04-30 14:41:00 | [匿名用户:Ninputer]
回复: 实现一个非零下标数组 编辑
我觉得非零下标的数组,会损伤代码的可读性。而且会对数组的遍历带来不必要的麻烦。比如你把一个数组作为参数传给另一个方法,那么在那个方法里面必须先获得数组的下界和上界,然后才能使用,而不像现在C#里那样,可以省掉获取下界的麻烦。
2004-04-30 14:08:00 | [匿名用户:Justin Shen]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System