關(guān)于數(shù)組纱烘,在C#中我們可以創(chuàng)建一維數(shù)組,多維數(shù)組以及交錯(cuò)數(shù)組祈餐。
一維數(shù)組和多維數(shù)組都好理解擂啥,交錯(cuò)數(shù)組是個(gè)什么鬼?
其實(shí)在前面的隨筆中帆阳,我都有寫到哺壶,交錯(cuò)數(shù)組就是一個(gè)數(shù)組的成員還是數(shù)組,這樣的數(shù)組叫做交錯(cuò)數(shù)組蜒谤。
關(guān)于在C#中數(shù)組的創(chuàng)建:
class ArrayLearn
{
static void Main(){
int[] array1 = new int[10]; //一維數(shù)組
int[] array2 = new int[] {1,2,3}; // 一維數(shù)組山宾,并且初始化
int[] array3 = {1,2,5,7,8}; //另一種初始化的一維數(shù)組
int[,] mArray1 = new int[2,5]; //二維數(shù)組
int[,] mArray2 = { {1,5,7},{8,6,10,2} }; //二維數(shù)組初始化
int[][] jArray1 = new int[2][]; //交錯(cuò)數(shù)組
jArray1[0] = new int[3]{1,5,7};
}
}
C#中數(shù)組的一些需要注意的地方:
- 當(dāng)創(chuàng)建了數(shù)組實(shí)例時(shí),將建立維度數(shù)和每個(gè)維度的長度鳍徽。 在實(shí)例的生存期內(nèi)资锰,這些值不能更改。
- 數(shù)值數(shù)組元素的默認(rèn)值設(shè)置為零阶祭,而引用元素的默認(rèn)值設(shè)置為 null绷杜。
- 交錯(cuò)數(shù)組是數(shù)組的數(shù)組,因此其元素是引用類型并初始化為 null濒募。
- 數(shù)組元素可以是任何類型鞭盟,包括數(shù)組類型。
- 數(shù)組類型是從抽象基類型 Array 派生的引用類型瑰剃。 由于此類型實(shí)現(xiàn)了 IEnumerable 和 IEnumerable<T>(迭代器)齿诉,因此可以對 C# 中的所有數(shù)組使用 foreach 迭代。
在C#中晌姚,數(shù)組不同于C或者C++里的那樣是一片可尋址的連續(xù)內(nèi)存區(qū)域粤剧,而是一個(gè)對象。
Array類是所有數(shù)組類型的抽象基類型舀凛,所以俊扳,我們可以使用其屬性以及一些方法。
Array類提供了許多有用的屬性和方法猛遍,比如Length,Rank等等号坡。
當(dāng)我們使用new運(yùn)算符創(chuàng)建一個(gè)數(shù)組的時(shí)候懊烤,整個(gè)數(shù)組就已經(jīng)被初始化為默認(rèn)值了,
比如上述代碼中第一個(gè)一維數(shù)組逃沿,10個(gè)成員全是0应闯,因?yàn)閕nt型變量的默認(rèn)值就是0陶珠,如果是string的話,默認(rèn)值就是null壁肋。
對于創(chuàng)建的一個(gè)數(shù)組是值類型還是引用類型号胚,就要看申明的類型了,
比如:Type[] array = new Type[10];
該語句的結(jié)果取決于 Type 是值類型還是引用類型浸遗。 如果為值類型猫胁,則語句將創(chuàng)建一個(gè)有 10 個(gè)元素的數(shù)組,每個(gè)元素都有 Type 類型跛锌。 如果 Type 是引用類型弃秆,則該語句將創(chuàng)建一個(gè)由 10 個(gè)元素組成的數(shù)組,其中每個(gè)元素都初始化為空引用髓帽。
對于多維數(shù)組聲明以及初始化:
你可以這樣:
int [菠赚,] array = { {1 , 2} , {3 , 4} };
但是如果你先聲明:int [ , ] array1;
然后再去初始化:array1 = new int [ , ] { {1 , 2} , {3 , 4} }; //對的
注意:你不能這樣:array1 = { {1 , 2} , {3 , 4} };//錯(cuò)誤
我們可以針對數(shù)組或者集合等,用foreach來進(jìn)行循環(huán)遍歷
比如:
int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };
foreach (int i in numbers)
{
System.Console.Write("{0} ", i);
}
注意foreach中的那個(gè)i并不是指數(shù)組下標(biāo)郑藏,而是指數(shù)組內(nèi)的成員衡查。
當(dāng)我們將數(shù)組作為參數(shù)傳遞進(jìn)方法的時(shí)候,其實(shí)和正常的參數(shù)傳遞是一樣的使用方法必盖。
對于out和ref關(guān)鍵字的運(yùn)用峡捡,也是一樣的。
如果用out關(guān)鍵字筑悴,那么可以不必對數(shù)組進(jìn)行初始化们拙,但是在方法體結(jié)束之間一定要對數(shù)組參數(shù)進(jìn)行初始化。
如果用ref關(guān)鍵字阁吝,那么必須在參數(shù)傳遞之前將其進(jìn)行初始化砚婆。
關(guān)于隱式數(shù)組:
可以創(chuàng)建隱式類型的數(shù)組,在這樣的數(shù)組中突勇,數(shù)組實(shí)例的類型是從數(shù)組初始值設(shè)定項(xiàng)中指定的元素推斷而來的装盯。
有關(guān)任何隱式類型變量的規(guī)則也適用于隱式類型的數(shù)組。
public class ImplicitlyTypedArraySample
{
static void Main()
{
var a = new[] { 1, 10, 100, 1000 }; // int[]
var b = new[] { "hello", null, "world" }; // string[]
// single-dimension jagged array
var c = new[]
{
new[]{1,2,3,4},
new[]{5,6,7,8}
};
// jagged array of strings
var d = new[]
{
new[]{"Luca", "Mads", "Luke", "Dinesh"},
new[]{"Karen", "Suma", "Frances"}
};
}
}
注意:上述代碼中甲馋,并沒有在等號(hào)的左側(cè)使用方括號(hào)埂奈,這是因?yàn)槭褂胿ar,相當(dāng)于一種匿名類型
var表示的是一種弱化類型定躏,其可以代替任何類型账磺。
使用var定義變量時(shí)有以下四個(gè)特點(diǎn):
必須在定義時(shí)初始化。也就是必須是var s = “abcd”形式痊远,而不能是如下形式: var s; s = “abcd”;
一但初始化完成垮抗,就不能再給變量賦與初始化值類型不同的值了。
var要求是局部變量碧聪。
使用var定義變量和object不同冒版,它在效率上和使用強(qiáng)類型方式定義變量完全一樣。
OK逞姿,關(guān)于數(shù)組的基礎(chǔ)知識(shí)就記錄到這里