- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
由string与String谈起
由 string與 String談起
黃宣龍
asker_pachelbel@
string or String?
如果你是個 C#初學者,也許你曾經懷疑過這個
問題:「書上不是說 C#是個大小寫有別的語言
嗎?那為什麼這兩個程式都可以跑?」
using System;
class Class1
{
static void Main(string[] args)
{
string s = I love dotspace.;
//這個string是小寫開頭
Console.WriteLine(s);
}
}
using System;
class Class1
{
static void Main(string[] args)
{
String s = I love dotspace.;
//這個String是大寫開頭
Console.WriteLine(s);
}
}
事實上,這兩個程式不但都能跑,如果你使用
ildasm來看這兩段程式碼編譯出來的 IL碼的
話,你還會發現這兩個程式根本就產生了一模一
樣的 IL碼。這到底是怎麼一回事呢,這兩段程
式碼究竟有沒有差別呢?
內建型別(Predefined Type)
按照坊間升研究所補習班教的答題技巧指導來
看,若這一題只有 10分,答案應該是「String
指的是 System.String類別,而 string則是 C#內
建的關鍵字。事實上,string正是對應到
System.String類別,也可說 string是 System.String
類別在 C#中的化名(alias),因此兩段 C#程式碼
都會編譯出相同的 IL碼,對於 CLR而言這兩者
是沒什麼差別的。」
若是這題被配了有 40分呢?那也許我們得由什
麼叫做內建型別(Predefined Type)談起。
內建型別,又稱做原生型別(Primitive Type),顧
名思義就是一個語言內建的型別。也就是說,一
個符合該語言標準的編譯器,應該要能直接支援
這種型別。一般來講,這意味著該語言應該會為
該型別規範出一個語言關鍵字,而編譯器要能認
得這個關鍵字並在編譯時產生適當的碼。以 C#
來說,像是整數(int),浮點數(float),字串(string)
等都是內建型別,你可以直接使用這些關鍵字撰
寫你的程式,而 C#編譯器將能看懂這些關鍵字
並為你編譯出適當的 IL碼供執行之用。這邊還
有個比較不嚴謹的簡陋講法,「程式語言有提供
化名(alias)的型別就是該語言的內建型別了」。
為什麼需要內建型別呢?
為什麼要讓編譯器支援這些關鍵字來對應這些
型別呢?有一個原因是因為這些型別實在太常
用了,透過這樣的方式會方便許多。當你想要用
一個變數來儲存年齡時,你想要怎麼寫呢?是
int age = 20;
還是
System.Int32 age = new System.Int32();
age = 20;
畢竟整數,浮點數,字元,字串等型別在程式中
實在太常用了。如果每次都得來一行
System.Int32 age = new System.Int32();
實在吃不消不是嗎?
此外,內建型別也意味著編譯器在設計時就已經
瞭解這些型別的實作細節,所以編譯器對於內建
型別可以有更多的處理知識,因而能更有彈性且
有力的處理這些型別。舉例來說,在使用內建型
別時我們可以不用 new來 new去,一行
int i = 10;
就通通搞定。而在將精度較低的內建型別轉型至
精度較高的內建型別時我們可以不需多做指示
地讓它隱式轉型(Implicit cast):
int i = 20;
double j = i;
請注意,這和衍生類別能自動向上轉型(upcast)
為基底類別的情況並不一樣,因為 int並不是繼
承 double而來,他們都是繼承自
System.ValueType,換言之,在繼承體系之中,
他們倆是平行的。此例之中 int之所以能自動地
轉型成 double乃是因為編譯器知道 int和 double
這兩個內建型別是做什麼用的,並判斷出可以無
害的將 int轉型為 double,因此能順利編譯過關
且正常運作。
那麼,到底要 String還是 string呢?
現在,你應該已經知道什麼叫內建型別,也瞭解
到 String和 string到最後都是一樣的,因為這兩
種程式碼都會產生相同的 IL碼。那麼,我們到
底應該使用哪種風格來撰寫程式呢?在 C#語言
規格書 1.2.1中是這樣說的:「As a matter of style,
use of the keyword
原创力文档


文档评论(0)