(读书笔记).NET大局观-.NET语言(1)
通用語言運行時
?
通用語言運行時被明確設計為支持多種語言,一般而言,建立于CLR之上的語言可以獲得共同的良好處理。通過一個宏大的核心語義集,CLR還界定了一個以它為基礎的典型編程語言的大體部分。例如對于任何一種基于CLR的語言,單單領會“CLR所定義的標準類型”如何被映射到特定語言宏,就占了很大部分的學習量,當然你還必須學習特定語言的語法和控制結構,然而一旦掌握了CLR所提供的東西,面對任何一種建立于其上的語言,你已經占領的先機。
?
題外話:JAVA在.NET框架中的處境
從一開始,微軟就提供了一個.NET框架版的JAVA編程語言,J#
在兩種情況下J#是恰當的選擇:
第一種情況:需要將現有的JAVA代碼轉移到.NET框架
第二種情況:經驗豐富的JAVA開發人員遷移到.NET框架中,人們常常有一種對自己所熟悉語法的強烈的附屬感覺,因此在一個熟悉的語言中工作會使得過渡更加容易。
?
所有的C#程序由一定數量的類型組成,其最外源必定是類,接口,結構,枚舉或者委托。還有命名空間,所有方法和字段必須隸屬于上述的類型之一,這意味著C#不允許全局變量和全局函數。
?
?
Public double ?good(double ?s)
{
? ReturnSystem.Math.Sqrt(s);
}
good函數帶了一個參數和一個返回值,這些參數都已傳值得方式傳入,這是C#的缺省行為,意味著函數返回時,函數內部對參數值所做的更改,不會被調用端看到,如果參數前面標以關鍵字ref,這就會造成引用方式傳遞參數,如此一來函數內部對參數所做的任何改變,就都會反映給調用端。
?
?
C#不能像C/C++那樣吧參數也設為void,使得,void的唯一用途就是致命某個方法不傳回任何值。
?
?
C#提供的類型
| sbyte | 有符號8位整數 | -128-127 | SByte | ||
| byte | 無符號8位整數 | 0-255 | Byte | ||
| short | 有符號16位整數 | -32768-32767 | Int16 | ||
| ushort | 無符號16位整數 | 0-65535 | UInt16 | ||
| Int | 有符號32位整數 | -2147489648-2147483647 | Int32 | ||
| uint | 無符號32位整數 | 0-42994967295 | UInt32 | ||
| long | 有符號64位整數 | -263-263 | Int64 | ||
| ulong | 無符號64位整數 | 0-264 | UInt64 | ||
| float | 32位單精度實數 | 1.5*10-45-3.4*1038 | |||
| double | 64位雙精度實數 | 5.0*10-324-1.7*10308 | |||
| demcimal | 128位十進制實數 | 1.0*10-28-7.9*1028 | |||
| ? | ? | ? | ? | ? | ? |
?
?
對于屬性的一種“極端”的觀點,永遠不要使用公開字段,屬性總是一個更好的選擇。
?
?
結構
CTS沒有明確定義一個結構類型,而C#結構是基于類的,并且像類一樣,結構可以實現接口,包含方法,字段,屬性,不過與類不同,結構是值類型而非引用類型,這意味著他們被分配于堆棧之上,此外值類型不能參與繼承,因此C#結構不能參與繼承自其它類型,
?
?
委托和事件
傳遞一個指向方法的引用是件合情合理而且稀松平常的事情,假設你需要通知代碼,請它于特定事件發生時代用你所提供的一個方法,那么你就需要某種辦法將運行期間將回調函數傳入。C++中你可以通過“傳入方法的地址”辦到這一點,然而在.NET框架類型安全的世界里,并不允許地址傳遞,但這并不能說NET之中就沒有這個需求了
這里就用到了委托和事件
CTS定義了引用類型委托,目的正是為此,一個委托就是一個對象,它包含一個引用,后者指向一個“具有特定簽名”的方法,一旦你創建了它并加以初始化。就可以將其作為參數傳入其他方法并調用之。
詳細參見博文:http://blog.csdn.net/yixiantian7/article/details/10586075
NetFramework的編碼規范:
?? 委托類型的名稱都應該以EventHandler結束。
委托的原型定義:有一個void返回值,并接受兩個輸入參數:一個Object 類型,一個 EventArgs類型(或繼承自EventArgs)。
?public delegate void BoiledEventHandler(Object sender,BoiledEventArgse );
?
?? 事件的命名為 委托去掉 EventHandler之后剩余的部分。
public event BoiledEventHandler Boiled; //聲明事件
?
?? 繼承自EventArgs的類型應該以EventArgs結尾。
??// 定義BoiledEventArgs類,傳遞給Observer所感興趣的信息
??????publicclass BoiledEventArgs : EventArgs {
??????????publicreadonly int temperature;
??????????publicBoiledEventArgs(int temperature) {
?????????????this.temperature = temperature;
??????????}
?
?? 這里還有一個約定俗稱的規定,就是訂閱事件的方法的命名,通常為“On事件名”,比如這里的OnBoiled。
?protected virtual voidOnBoiled(BoiledEventArgs e) {
??????????if(Boiled != null)
?{ // 如果有對象注冊
?????????????Boiled(this,e);? // 調用所有注冊對象的方法....在這個地方引發了事件
??????????}
?
事件所使用的委托稱為事件處理器(eventhandler)
它其實就是一個普通的委托,不過,NET框架為這些事件處理定義了兩個約定
1 事件處理器不返回任何值,也就是它的返回值是void
2 事件處理器總是接受兩個參數,第一個參數標識事件的發起者,按照慣例命名為sender
其類型為system.object(在C#中 就是object類型,他是system.object的一個別名)這使得事件接收者反過來于觸發事件對象進行通訊更加方便,第二個參數包含事件發起者調用事件處理器傳入的全部數據,習慣上將其命名為e,其類型是System.EventArgs或是繼承自System.EventArgs的類型
下面就是是個事件處理器的例子
Public delegatevoid MyEventHandler(object sender, MyEventArgs e)
?
?
?
其他一些C#特性:
命名空間
異常處理
參見博文:http://blog.csdn.net/yixiantian7/article/details/10390117
?
?
關于屬性attributes(用實例來講這個更容易理解)
參見博文:http://www.cnblogs.com/luodong/archive/2009/07/14/1523012.html
(一)?在前臺用JS寫的腳本方法,除了可以直接用在前臺控件的屬性中,還可以在后臺運用。即在后臺頁面加載時,調用JS方法。語法格式有兩種,如下:
??????1.第一種寫法:控件ID名.Attributes.Add(“事件名稱”,“JS方法”);
??????如:一個按鈕控件Button1.Attributes.Add(“onclick”,“returnconfirm('確認?')”);
??????2.另一寫法:控件ID名.Attributes["事件名稱"]=“JS方法";
??????如:前臺寫了一個JS方法: function ISCheck(){。。。。。。};
???????????Button1.Attributes[“onclick”]="ISCheck()";
????PS:另外還可以控制某一個文本框的屬性,比如文本框的大小,寬度等。
???????如:TextBox1.Attributes.Add(“width”,“80px”);
(二)前面是第一部分,是學習的別人的.下面提出一點自己的:
????在后臺用this.form名字.attributes["名稱"]=...儲存名字.
?????在前臺調用: var f=document.form名字;??? 變量=f.attributes["名稱"].value;
?
?
?
編寫不安全代碼
在c#使用指針就意味著不依賴垃圾回收機制來幫你管理內存,在這些情況下,C#允許你使用指針,這就是我們常說的”不安全代碼”
在不安全代碼中使用指針,這樣就帶來了指針具有的好處和缺點,為了使這種不全的行為盡可能安全一點,C#要求所有這種代碼必須明白標以關鍵字unsafe,在一個不安全的放阿飛內我們可使用fiexd語句鎖定一個或者多個位于托管堆上的引用類型(有時候這種做法稱為“釘住”(pinning))
?
?
預處理指令
和C/C++不同的是,C#沒有預處理器,編譯器對預處理器的大多數功能都提供了內建支持
?
例如:C#預處理器指令包括#define,這是一個C/C++開發人員習以為常的術語,然而這個術語不能被定義“以一個詞代表一個字符串”,#define只能用于定義記號,記號可以和#If指令一起使用,提供條件編譯的功能
?
?
題外話:
C#是一個比java更好的語言嗎?
這個問題沒有客觀答案,即使真的如此也無足輕重,僅僅因為編程語言而選擇一個開發平臺,就像僅僅喜歡車上的收音機而買下那輛車一樣,你當然可以這么做,但如果你基于通盤考慮而做下決定,你會更開心。
?
轉載于:https://www.cnblogs.com/pangblog/p/3297122.html
總結
以上是生活随笔為你收集整理的(读书笔记).NET大局观-.NET语言(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 1698 Alice's Cha
- 下一篇: 你觉得中国大陆的影视作品,内容很枯燥无味