C#中的数组


在数据结构算法,以及科学计算中,数组是必不可少的工具。习惯了C中简单直接的数组表达方式的程序员,初次使用C#中的数组时,可能会有一些茫然。本文采用对比的方式来学习C#数组的使用方式。本文不介绍那些语法糖的东西,尽管语法糖有时候能大大地简化代码。

1 一维数组

C 语言中一维数组实例代码如下:

#include <stdio.h>

int main(int argc, char** argv)
{
    int a[10];
    int i = 0;
    for(i=0; i<=10; i++)  //当i=10时,数组越界
    {   
        a[i] = i;
    }   
}

总结特点: (1)索引从0开始;(2)越界不会引发错误;(3)数组默认存放到栈内存中;(4)声明时必须制定长度;

C#中同样功能的代码如下:

class Test
    {
        static void Main()
        {
            int[] a;
            a = new int[10];
            for (int i = 0; i <= 10; i++) //i=10时,会抛出异常
            {
                a[i] = i;
            }
        }
    }

上述代码编译时通过,运行时发生异常。

总结特点:(1)索引从0开始;(2)越界运行时会产生异常;(3)数组本身是对象,所以存放到堆内存中;(4)声明语法与C有差异;(5)创建对象而不是声明时指定长度;


2 多维数组

多维数组在C和C#中的语法格式差别较大。以二维数组为例。先看C的:

#include <stdio.h>

int main(int argc, char** argv)
{
    int a[3][2];
    int i,j;
    for(i=0; i<3; i++)
    {   
        for(j=0; j<2; j++)
        {   
            a[i][j] = 0;
        }   
    }   
}


再看C#的:

    class IntroToLINQ
    {
        static void Main()
        {
            int[,] a = new int[3, 2];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    a[i,j] = 0;
                }
            }
        }
    }


注意,二维数组的索引语法发生了重大改变,在C#中不再是[i][j],而是[i,j]。这是因为[i][j]在C#被解释成数组的数组,而不是二维数组。除此之外就没差异了。

3 数组的数组

在C语言中不直接支持这种类型的数组。数组的数组也就是数组的嵌套,本质上是一维数组,其实是很好理解的。对于一维数组而言,如果数组的元素本身还是个数组,那么这就是数组的数组了。

当然这个概念可以无限层级的嵌套,数组的数组的数组的数组。。。。

C#代码:

class IntroToLINQ
    {
        static void Main()
        {
            int[][] a = new int[2][];
            a[0] = new int[10];
            a[1] = new int[3];
        }
    }


可以这样理解这种int[][]语法格式,其中的int表示最低层数组的元素的数据类型为int型。然后按照从前往后的顺序,第一个[]表示这是一个数组,第二个[]表示前面数组的元素的数据类型是数组,遇到;结束,表示这个[]是最后一个,其元素的数据类型就是前面的int。因为本质上数组的数组就是一维数组,所以创建的时候要制定一维数组的长度。

下面比较同样功能的多维数组和数组的数组:

class IntroToLINQ
    {
        static void Main()
        {
            //多维数组
            int[,] a = new int[3, 2];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    a[i, j] = 0;
                }
            }

            //数组的数组
            int[][] b = new int[3][];
            b[0] = new int[2];
            b[1] = new int[2];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    b[i][j] = 0;
                }
            }
        }


可以看出,使用数组的数组较为繁琐,好处是每个子数组的长度可以不同,本例则都设为2了。在数据计算中,这种需求比较少,所以能用多维数组的地方,尽量别使用数组的数组。

你可能感兴趣的:(C#中的数组)