吳昊 李曉會(huì)
摘要:C#語言中,數(shù)組和字符串在使用方面既有相似之處,又有明顯差異。掌握兩者的異同,對(duì)于深入理解C#語言語法以及使用C#進(jìn)行軟件開發(fā),保證開發(fā)順利進(jìn)行都有重要意義。在教學(xué)過程中,對(duì)兩者異同的比較剖析,能夠使學(xué)生更好地了解和掌握C#語言,進(jìn)一步使用C#語言進(jìn)行程序設(shè)計(jì)和軟件開發(fā)。
關(guān)鍵詞:C#;數(shù)組;字符串;存儲(chǔ)方式
中圖分類號(hào):TP311.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2019)09-0148-01
C#語言是微軟公司在其開發(fā)的.NET平臺(tái)上主推的一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,是計(jì)算機(jī)科學(xué)與技術(shù)等專業(yè)的一門重要課程。C#語言包含一套完整的語法、句法結(jié)構(gòu)體系。而數(shù)組(Array)和字符串(String)作為C#語言中兩種重要的數(shù)據(jù)類型(數(shù)據(jù)結(jié)構(gòu)),其定義、存儲(chǔ)和使用有很多特殊性。
在以往的教學(xué)中發(fā)現(xiàn),當(dāng)學(xué)生不能準(zhǔn)確理解數(shù)組和字符串在存儲(chǔ)、使用方式上的差異時(shí),對(duì)后續(xù)學(xué)習(xí),例如將數(shù)組作為方法的參數(shù),會(huì)有很大的影響。
針對(duì)以上問題,本文旨在通過對(duì)比來剖析C#語言中,數(shù)組和字符串的相同點(diǎn)和不同點(diǎn),幫助學(xué)生準(zhǔn)確掌握兩者的使用。
1 C#語言中數(shù)組與字符串屬于引用數(shù)據(jù)類型
在C#語言的語法體系中,數(shù)組與字符串都屬于和值類型相對(duì)應(yīng)的引用數(shù)據(jù)類型,這是兩者的相同之處。引用類型與值類型,在定義、存儲(chǔ)和使用方式上有很多的不同之處。
1.1 代碼舉例----值類型與引用類型
為了比較以數(shù)組為代表的引用類型與值類型的區(qū)別,分析如下程序代碼:
int m=5,n;
n=m;
m=-2;
Console.Write(n);
這段代碼首先定義兩個(gè)int類型變量m和n。m的初始值為5。將變量m的值賦給n,再將m的值修改為-2。此時(shí),變量m的值為-2,而n的值為5。
作為對(duì)比,再來看下面的代碼段。
int[] arr1 = { 1, 2, 3 }, arr2;
arr2 = arr1;arr1[0] = -10;
Console.Write(arr2[0]);
這段代碼首先定義兩個(gè)int類型數(shù)組變量arr1和arr2。arr1的初始值為{1,2,3}。將變量arr1的值賦給arr2,再將arr1的第一個(gè)元素(序號(hào)為0)值修改為-10。此時(shí),arr1的第一個(gè)元素的值為-10,而arr2的第一個(gè)元素的值也會(huì)變?yōu)?10。
1.2 案例分析
對(duì)于兩個(gè)值類型變量的直接賦值(如上面第一段代碼中的語句n=m;),是在兩塊不同的棧內(nèi)存之間完成數(shù)值的復(fù)制。因此當(dāng)修改其中一個(gè)值類型變量值的時(shí)候,對(duì)另外一個(gè)不會(huì)產(chǎn)生影響。
于兩個(gè)引用類型變量的直接賦值(如上面第二段代碼中的語句arr2 = arr1;),是在棧內(nèi)存之間完成用引用(該引用的值是保存在堆內(nèi)存上的數(shù)值部分的首地址)部分的復(fù)制。復(fù)制的結(jié)果使得兩個(gè)數(shù)組變量名的引用部分是相同,即都指向同一塊保存在堆內(nèi)存上的數(shù)值部分的首地址。因此當(dāng)使用數(shù)組名稱修改堆內(nèi)存上的數(shù)值時(shí),對(duì)另一個(gè)數(shù)組引用會(huì)產(chǎn)生影響。
2 字符串與數(shù)組引用方式不同
雖然字符串與數(shù)組一樣,也屬于引用數(shù)據(jù)類型。但字符串在使用時(shí),與數(shù)組有所不同。
2.1 代碼舉例----字符串與數(shù)組賦值操作的比較
分析下面一段代碼:
string s1 = "abc",s2;
s2 = s1;
s1 = "def";
Console.Write(s2);
這段代碼首先定義兩個(gè)字符串類型變量s1和s2。s1的初始值為"abc"。將變量s1的值賦給s2,再將s1的值修改為"def"。此時(shí)s2的值應(yīng)該是什么呢?按照上述1.2節(jié)的分析,同樣作為引用類型的字符串,應(yīng)該按照和數(shù)組操作相似的方式,s1和s2引用的地址相同,s1的值改變,s2的值也會(huì)發(fā)生相同改變。然而,事實(shí)并非如此。程序的實(shí)際運(yùn)行結(jié)果如圖1所示。
2.2 案例分析
字符串作為一種常用的引用類型,也是非常特殊的引用類型。正如微軟MSDN中關(guān)于字符串說明所提到的,字符串(String)的值是“不可更改的”。即當(dāng)修改一個(gè)字符串變量的值的時(shí)候,并不是將原來保存在堆內(nèi)存上的值改變,而是另外開辟一塊新的堆內(nèi)存保存新值,并將字符串變量在棧內(nèi)存上的地址引用修改為新的堆內(nèi)存的地址。因此案例代碼中變量s1指向新的堆內(nèi)存中的新值,而s2仍然指向原堆內(nèi)存中的原值。
3 結(jié)語
C#語言中,數(shù)組和字符串都屬于引用數(shù)據(jù)類型,其存儲(chǔ)方式有相同之處,即都在棧內(nèi)存上存儲(chǔ)引用(地址),在堆內(nèi)存上存儲(chǔ)數(shù)據(jù);但由于數(shù)組的值允許更改,而字符串的值不允許修改,因此在對(duì)應(yīng)類型變量賦值過程中,實(shí)際的運(yùn)行方式不盡相同。而對(duì)于字符串而言,如果需要在原堆內(nèi)存上直接修改數(shù)據(jù),可以使用另一個(gè)描述字符串的類----StringBuffer來實(shí)現(xiàn)。
參考文獻(xiàn)
[1] 吳昊,等.C# Windows程序設(shè)計(jì)及應(yīng)用[M].北京:清華大學(xué)出版社,2012.
[2] 侯鵬.C#中的字符串[J].電子世界,2014(16):86.
[3] 段春筍,杜立新.C#中動(dòng)態(tài)數(shù)組設(shè)計(jì)原理[J].電腦編程技巧與維護(hù),2005(07):24-25.
Abstract:In C# language, Arrays and strings have similarities,but obvious differences . It is significant that to understand the basic C# grammar and program by grasping the similarities and differences of arrays and strings.Duruing the teaching,it can help students master C# language deeply and use it to create application with the comparison of them.
Key words:C#;array;string;storage method