讀書筆記之——c#入門經典第五版.PDF


C# 
多為概念性的知識點:


.NET Framework 具有兩個主要組件:公共語言運行庫和 .NET Framework 類庫

OOP 面向對象技術
通用類型系統 CTS (Common type system)
公共語言運行庫 CLR (common language Runtime) 類似java的jdk
CIL (common intermediate language)通用中間語言、編譯的第一個步驟,由vs或 vce 完成。
JIT just-in-time 需要執行時由JIT編譯器 編譯成機器語言。類似java的jvm,針對不同os和cpu有不同的版本。
把可重用的代碼放到所有程序都可以訪問的地方,就成為全局程序集緩存GAC(global assembly cache)
程序集中包含CIL代碼exe 和 其他庫 dll
CLR可以托管代碼,讓.net自己與操作系統進行交互。好處是垃圾回收可以自動進行,但是程序員仍要進行必要的手動處理,不能依賴不定時的自動清理功能。

C#使用的是.Net Framework,幾種常見的應用程序類型:
* windows應用程序:使用。net framework的 Windows Forms模塊。比如office。
windows forms 模塊是個空間庫。包含很多按鈕菜單工具欄等,用於創建windows用戶UI。
也可以用Windows Presentation Foundation(WPF)來建立應用程序。

*Web應用程序:開發web頁面,用瀏覽器查看,.NetFramework 有個動態生成web的系統——Active Server Pages .Net(ASP.Net).
也可以用Silverlight 編寫在瀏覽器內部運行的應用程序。

*Web 服務。

以上類型訪問數據庫時候 用到的。net Framwork模塊 就是Active Data Objects。Net(ADO.NET)
這個是常見常用到的,還有其他ADO.NET Entity FrameWork 或C#的LINQ 等。

。net Framework 也有其他資源 創建聯網組件、輸出圖形、執行復雜數學任務的工具。

第二章
控制台應用程序:console Application F5運行完,debug目錄生成,F6,在release目錄生成,exe文件,可以點擊運行的。
F5 調試時候末尾加 console.readkey(); 否則控制台會一閃而過。
class-view 視圖怎么打開-類視圖
屬性窗口-properies window 中修改可直接影響代碼

控制台應用程序:比較簡單的命令行應用程序,可以用來演示。

windows窗體應用程序,windows Forms 可以添加各種控件,最大化關閉等。

第三章
C#編譯器,忽視空格tab回車符等。所以只要以分號結尾,理論上可以一行多個語句,也可以一條語句分多行。
Console.WriteLine("Hello world !"); 區分大小寫
#region-#endregion 設置代碼折疊用來突出顯示。

整數類型 byte short int long
還有sbyte ushort uint ulong 用來區分正負,精度值域是相同的。
比如byte 是2的8次方256位,0-255 ,sbyte 是-128~127 其他u開頭都自然數。
u與s 是sign 與unsigned的縮寫。無符號位的意思
浮點數類型 decimal float double 精度遞大。問題:怎么適用?
其他三種簡單類型
char bool string
char 是unicode 字符,存儲0~65535 的整數。

myString = "\"My Integer is\""; 轉移字符反斜杠\ 有歧義的輸出字符,前面加\
String myString1 = "this string has a\nline break"; \n 表換行轉義。而且前后無空格也能識別。
如果想在字符串中輸出倆個\\,就要分別配\\\\總共4給才行。
Console.WriteLine("{0}{1}", myString, myInteger); 不太懂啊,輸出倆變量,連接到一起。
選中變量等關鍵字,雙擊shift鍵,全屏篩選加底色。

C#變量命名規范區分大小寫。
hungarian(匈牙利) 命名法 iAge 表示int類型。但在大項目中容易混淆,所以建議用變量作用來命名,鼠標停留一段類型IDE會顯示類型的。
camelCase 駱駝命名法 or PascalCase 區別是首單詞的首字母是否大寫。看命名單詞的命名規范就造。

字面量規范,100L long類型的100;1.5f float類型的1.5 1.5m decimal類型的1.5

轉義字符有對應的unicode ,比如\'單引號對應0x0027
比如下面字符串等價:可用0027代表單引號'
"ZP\' string"
"ZP\u0027s string"

或者用整體轉義的字符@ 來代替逐個\轉義。
比如"F:\\ZP\\BOOK"
或者 @"F:\ZP\BOOK"

int a=5 聲明並初始化。賦值可以作為初始化。聲明和初始化是兩個可以分開的概念。

a=++b 表示a的值是b+1;b的值+1
a=b++ 表示a的值是b; b的值+1
-- 同理

a=console.readline()//獲取用戶輸入
double b=convert.ToDouble(a)

a-=b 等效於 a=a-b;
+=運算符可以用於字符串。.

名稱空間相當於比類更大的范圍,namespace 之前的全局要引用名稱空間內的名稱,需要加.來引用
LevelOne.NameOne
名稱空間可以嵌套,所以不同空間名稱可以重復
using 語句用來簡化這種帶.的不同名稱空間的引用。
如果命名有沖突,可起別名:
using LT=levelTwo;
然后在外層命名空間,就可以用LT.nametwo來引用LevelTwo.nametwo。 自己的nametwo就用nametwo引用。

using System;
System命名空間是.NET Framework應用的根命名空間。包括了控制台應用程序所需要的所有基本功能。

#所有命名空間是所有其他namespace的外部命名空間,引用就加using,或者文件加進來,用全路徑加點引用。

運算符優先級
resultVar+=var1*var2+var3%var4/var5
2元運算符優先級同數學。*/%混合運算符合結合律。親測。

第四章
邏輯運算符
! & | ^ 分別:非 與 或 異或(有且僅有一個為true)
&& || 連用 與& | 功能相同,但性能更好。所以更常用
或者是 & | ^ ~位運算符。 int類型轉換成01代碼,重新算數,~是按位取反。除數學應用外不太常用。
補位主要用來計算負數,因為二進制的原因,導致-x可定義為~x+1 ,那么10+(-5)=10-5=+5 最前面多1位1 表示正號。呵呵。
位運算還在顏色編輯有用到。000 黑色,100 010 001 分別表示紅綠藍。111表白色。十進制是7
位移運算符 (可擴展)
var1=var2>>var3 1是2的往右移3位得到。 1位是乘除2 ,var3位,即2的var3次方。 位移運算一般用於高度優化的代碼,驅動程序或系統代碼。


三元運算符
<test>?<resultIfTrue>:<resultIfFalse> 其中test是bool值
可以直接賦值eg
string resultString=(myInteger<10)?"Less than 10":"Greater than or equal to 10";
如果啥比較大小,並做大量操作,就應該用if
if else 可以嵌套,也可以並列,
if{}
else if{}
else{}
可縮減成switch 可配合return goto等

const 常量修飾符
const int intTwo=2; 必須賦值,且只能賦值一次。

console.writeLine("in {0} year{1},you'll have a balance of {2}",totalYears,totalYears==1?"":"s",balance);
三元運算符最常用的應用——用最少的代碼有條件的格式化文本。

循環
do{}while();與while(){}區別,dowhile至少會執行一次

dowhile or while循環常用作用戶輸入的有效性檢查。
Console.WriteLine("what balance would you like to have");
do
{
targetBalance=Convert.ToDouble(Console.ReadLine)
if()
Console.WriteLine("you must enter an amount greater than your current balance\nPlease enter anoter value");
}
while(targetBalance<=balance);

for 循環與 while循環最大區別,for可以指定次數,並維護自己的計數器。
4個終端循環的命令
break continue goto return
依次為:立即終止循環;立即終止當前的循環,繼續執行下一次循環;
可跳出循環,到標記位置;跳出循環及其所包含的函數。
使用goto跳出循環是合法的,使用goto從外部進入循環則是非法的。

98頁習題多看看。

第五章 高級變量類型

枚舉,結構,數組
隱式轉換和顯示轉換
低精度向高精度的轉換可直接進行,成為隱式
顯示轉換即被稱為強制類型轉換。eg:前面加(byte)
還可以強制檢查是否溢出,轉換類型前加checked
byte b; int a=256;
b=checked((byte)a) 如果溢出則程序報錯overflow
IDE可以設置默認是unchecked 還是 checked

枚舉數據類型 自己聲明描述一個類型,並聲明這個類型的變量。關鍵字 enum
定義:
enum<tpyeName>{<value1>,<value2>,<value3>}
聲明
<typeName> <varName>
賦值
varName=typeName.value

枚舉的基本數據類型默認為int,也可以指定其他,語法為
enum <tpyeName>:<underlyingType>{a,b,c,d}

講string類型轉換為枚舉值,語法比較復雜,用到Enum.Parse() 和 typeof()
eg:
string myString="North"
orientation myDirection=(orientation)Enum.Parse(typeof(orientation),myString);
疑問:string類型的枚舉怎么聲明。

結構struct 縮寫structure
struct name
{enum a;double b}

結構和枚舉一樣,也是再代碼的主體之外聲明,在名稱空間之內。
結構的元素需要加訪問權限,如public

數組
<baseType>[] <name>;
basetype也可以是枚舉enum 和 結構struct類型;數組必須在訪問之前初始化。
初始化的兩種方法
1,以字面形式指定數組的完整內容。類似窮舉
2,int[] myIntArray=new int[5]; 用new關鍵字初始化。默認值是0; 也可以用變量初始化。

遍歷數組中每個元素時,最好用foreach.只讀訪問,直接用作輸出。
foreach (<baseType> <name> in <array>){//can use <name> for each element}

多維數組,
double [,] hillHeight=new double[3,4];
表示3行4列的數組。舉例窮舉:hillHeight[3,4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}}
索引是0開始,比如hillHeight[2,1]值為 第3行,第2列,即是 4.
測試多維數組的foreach 會給出實際值。

數組的數組
也稱為鋸齒數組,與多維數組(也稱為矩形數組)相比,鋸齒數組的每個元素,也是一個數組,而且子數組的元素個數可以不盡相同。
也可引申更深層次,數組的數組的數組。 但是這些數組都必須有相同的基本類型。

字符串處理
string 類型變量可以看作是char變量的只讀數組。

省略trim split 等字符串方法應用

第六章
方法
return 所有的處理路徑都必須執行到return 否則就不合法。會報錯。
通過void聲明的方法,如果用return函數會立馬終止,且不允許return后跟返回值,只能是;分號

參數數組
如果一個方法,參數是數組類型,而且需要傳入元素數量不確定,可以用params修飾。
eg 輸入任意個數的int數字,然后返回幾個數字之和。static int SumValues(params int [] values){return sum}
參數數組 是作為參數的一個數組。
數組參數,是把數組當參數。
實質一樣,側重點不一樣,屬偏正短語。

引用參數&值參數。
ref關鍵字,修飾函數參數。適用范圍:調用函數會改變參數的值。這也決定了,參數必然不能是const類型。也必須初始化。不然函數沒意義了
out 關鍵字,可以是未賦值。

局部變量與全局變量重復,則在方法內使用全局變量,則要指明全名:class.para即類名點變量名。
?什么時候適用全局變量

雷到我了,結構里面居然能套函數和聲明變量。
可集中處理常見任務,簡化過程。

值傳遞和引用傳遞 的不同也可以看作是函數的重載。
eg static void ShowDouble(ref int val){}
static void ShowDouble(int val){}

?托管代碼與非托管代碼區別

委托把delegate 把方法又抽象了一層。
我理解委托是C#對OOP概念的徹底化 ,把返回值和參數相同的方法 也抽象出來了,這個類起個名字稱為 委托,語法重新定義,沒有方法體,初始化時候,參數是其他方法的方法名。使用時候可以把委托對象,當成方法名用。
定義
delegate double processDelegate(double para1,double para2)
static double Multiply(double para1,double para2){……}
static double Divide(double para1,double para2){……}
聲明
processDelegate process
初始化
process=new processDelegate(Multiply) 或者 process=new processDelegate(Divide)//多么霸氣,把方法名當參數。
使用
double result=process(double para1,double para2);

命令行參數,即使main (string []args) 中args的參數值,在項目-右鍵-調試里,有命令行參數填寫位置。用空格分隔。

第七章,調試和錯誤處理
跳過了

第八章,oop

以下幾個概念,指的都是在類里面
構造函數
所有類定義都至少包含一個構造函數。默認構造函數是無參數的,並且與類同名。
Coffee myCoffee=new Coffee();
也可包含幾個帶有參數的構造函數,稱為非默認的構造函數。
Coffee myCoffee=new Coffee("blue mountain");

靜態屬性和方法 字段,可看作類的全局對象。靜態成員可以在類的實例之間共享。使用靜態成員甚至不用實例化對象
比如:console.writeLine(); Convert.ToString()等。

靜態構造函數:一個類只能有一個靜態構造函數。不能有訪問修飾符,也沒有參數。在創建該類實例時執行,或訪問包含靜態構造函數的類的靜態成員時執行。
非靜態構造函數也稱為實例構造函數。

如果希望一個類只包含靜態成員,可以將類 設置為 靜態類。靜態類只包含靜態成員,不需要實例構造函數。因為他不能被實例化。

接口是把公共實例(非靜態)方法和屬性結合起來,以封裝特定功能的一個集合。一旦定義了接口,就就可以 在類中實現它。這樣,類就可以支持接口所指定的所有屬性和成員。

值類型和引用類型的一個主要區別就是:值類型總是包含一個值,而引用類型可以是null,表示不包含值。
只有string和object簡單類型是引用類型,數組也是隱式的引用類型。每個類都是引用類型。
基本數據類型&引用數據類型。
結構類型和類的重要區別就是 結構是值類型。

抽象方法只能存在於抽象類中

對象的生命周期:用構造函數創建對象,用析構函數刪除對象。
永遠不應手動調用對象的析構函數,.Net運行庫環境會在垃圾回收過程中自動完成該任務。
實現IDisposed接口的類對象,可以刪除。

實例成員只能在類的對象實例上使用,靜態成員只能直接通過類定義使用,它不與實例關聯。

接口是可以在類上實現的公共屬性和方法的集合。
多態性:從一個派生類中實例化的所有對象都可以看作是其父類的實例。

第九章 定義類
默認聲明class 是內部的,修飾符internal 即只有當前項目中的代碼才能訪問它。
也可以是public 可由其他項目中的代碼訪問

修飾符 abstract/sealed 抽象/密封的,
抽象類不能實例化,只能繼承;密封只能繼承
所以倆關鍵字互斥

所以抽象類必須這樣聲明
public abstract class MyClass{
//class members,may be abstract
}
其 myclass 是一個公共抽象類,也可以是內部抽象類。
與抽象類一樣,密封類也可以是公共或內部的。

編譯器不允許派生類的可訪問性高於基類。內部類可繼承一個公共基類;反之則不行。

——————————————————

類庫項目:如果一個項目什么都不包含,只包含類(以及其他相關的類型定義,但沒有入口點),該項目稱為類庫。
類庫編譯為.dll程序集,在其他項目中添加對類庫項目的引用。
?引用放到項目下面會怎么樣?

接口和抽象類
同: 都包含可由派生類繼承的成員;都不能被實例化;但可以聲明這些類型的變量。
如果聲明變量,則可用多態性,把繼承這兩種類型的對象指定給他們的變量。以通過這些變量使用這些類型的成員,但不能直接訪問派生對象的其他成員。

異:派生類只能繼承一個基類,即是只能直接繼承一個抽象類(但可以用繼承鏈包含多個抽象類)
接口則無數量限制。兩種做法實際效果區別不大
接口的成員都是公共的(他們傾向在外部使用),抽象類的成員可以是私有的(只要他們不是抽象的)受保護的,內部的等。
此外,接口不能包含字段 構造函數 析構函數 靜態成員 或常量。

抽象類主要用作對象系列的基類,共享某些主要特性,例如,共同的目的和結構。接口則主要用於類,這些類在基礎水平上有所不同,但仍可以完成某些相同的任務。

淺度復制和深度復制
把每個成員從一個對象復制到另一個對象中可能不會成功,因為其中一些成員可能是引用類型。
簡單的按照成員復制對象可以用object的MemberwiseClone()方法完成。稱為淺度復制。因為他沒考慮引用類型成員。
因此,新對象中的引用成員就指向源對象中相同成員的對象,有時候並不滿意這樣處理。
如果要創建新實例(復制值,而不復制引用),則需要deep copy 深拷貝,而不是shallow copy淺度復制
具體需要自己實現, 可以實現一個ICloneable接口,如果使用這個接口,就必須實現它包含的Clone()方法。這個方法返回一個object類型的值。
具體就是序列化方法或者手動重新new一個,挨個賦值每個成員,再返回對象。

靜態類的主要特征
1,僅包含靜態成員
2,無法實例化
3,是密封的
4,不能包含實例構造函數

靜態類在編譯時會被自動標記為sealed 密封不繼承

雖然字段不能聲明為 static const,但const字段的行為在本質上是靜態的。
C#不支持靜態局部變量(在方法內部定義靜態變量)
在C#中靜態成員是比較敏感的東西,在不是十分確認的情況下不要使用;

.NetFramework中公共字段以 PascalCasing 形式來命名
比如 public int MyInt;
私有變量 用camelCasing命名。

字段也可以使用關鍵字 readonly,表示這個字段只能在執行構造函數的過程中賦值,或由初始化賦值語句賦值。

靜態字段必須通過定義他們的類 來訪問,在上面的示例中,是MyClass.MyInt;而不是通過這個類的對象實例來訪問。靜態方法也一樣。
另外,可以使用關鍵字const來創建一個常量,const也是靜態的,所以不必加static修飾符,加了會報錯。

方法還可以加以下關鍵字
virtual:方法可以重寫
abstract:方法必須在非抽象的派生類中重寫(只用於抽象類中)
override:方法重寫了一個基類方法(如果方法被重寫,就必須使用該關鍵字)
extern:方法定義放在其他地方。

公共屬性也用PascalCasing方式命名。與字段和方法一樣。
eg
public int MyIntProp
{
get{}
set{}
}

可以把字段設為私有,外部的代碼使用屬性來訪問字段。

屬性可以使用virtual override abstract 關鍵字,就像方法一樣,但這幾個關鍵字不能用於字段。
屬性可以保證安全,當不在本類中使用時可以保證使用屬性名,避免用字段名,而在屬性里面可以加限制,保證字段安全
如在set get里加判斷和拋出異常;屬性沒有存儲數據的功能,數據都存在字段中,所以只有修改字段的數據才能更改數據,修改屬性的值沒用。

常量是一個符號,是在編譯時已經存在且在程序生命周期內不會發生改變的值

vitual方法
虛方法,可在派生類中override 覆蓋,不覆蓋也可由實例調用
無此標記,也無其他標記,重寫時需用new隱藏原方法,但無virtual也可用new
abstract和virtual 重寫時都使用override關鍵字。
用new關鍵字,可以隱藏基類方法

base與this關鍵字
this 也可以用在類成員內部,引用當前對象實例,即不能在靜態成員中使用this關鍵字,因為靜態成員不是對象實例的一部分。

嵌套類型定義,java中應該叫內部類
myNestedClass

隱藏與重寫區別(new與override區別)
運用多態,用基類型引用派生類對象調用被隱藏或重寫的方法時,new調用基類方法,override調用派生類方法。

接口成員不能包含代碼體。

**其他
在一個類中,如果一個變量能夠用來描述一個類的屬性,那就定義為成員變量,否則,它就應該定義為局部變量。而如果一個變量在全局中都能使用(某個內容是被所有對象所共享),那么我們就可以把這個變量用static來修飾,即為靜態變量。(還要注意它與靜態方法的緊密聯系,這里且不細述了)

類加載的本質 是將字節碼文件(編譯過的文件,如class文件)通過類加載器加載到內存中。

第11章
一個程序集可以跨越n個命名空間,一個命名空間也可以包含n個程序集.

如果說命名空間是類庫的邏輯組織形式,那么程序集就是類庫的物理組織形式。
只有同時指定類型所在的命名空間及實現該類型的程序集,才能完全限定該類型

更新至261頁

PQT8W-68YB2-MPY6C-9JV9X-42WJV visual C# express 注冊碼(visual C# express 2010)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM