小弟剛也是剛開始學習c#以及.net ,寫過一些代碼。感覺基礎還是很重要的,所有想認真地學習一遍 《C#進階編程(第四版)》。本著吃透的態度,我會對自己不怎麼確定的地方和感覺容易出錯的地方,做一些demo 來驗證。肯定會有些自己理解錯誤的地方,請各位提出,一起進步。(文章中的代碼都是在vs2005中調試通過的。)
時間:2008-2-25
內容:第二章 c#基礎(23~99)
一、c#中定義的任何的變數(實值型別和參考型別)必須先初始化再使用,不然編譯出錯。
二、注意參考型別 string 的特殊性:雖讓string是參考型別,但是如果對一個string執行個體做修改,那麼會建立一個新的string執行個體,這一點與其他的參考型別是不同的。
三、XML文檔說明:C#有根據特定的注釋自動建立XML格式的文檔說明的功能,用三斜杠(""")表示
時間:2008-2-26
內容:第三章對象和類型(100~116)
五,類中的常量成員不能聲明為static ,是不是常量成員預設的都是static 的?常量成員是屬於類的資料,還是屬於類的執行個體---對象的資料?
常量成員是屬於類的資料,因為一個類中聲明了一個常量,那麼在初始化之後它是不可變的,它是一個類中共用的。類似於static型的成員。
六,方法參數傳遞的三種方法:
1,值傳遞
2,引用傳遞 ref ,傳得是引用,可以對該參數修改
3,輸出傳遞,out ,主要是實現輸出的問題(返回多個參數)。
C# 在方法參數傳遞的要求:在傳遞給方法之前,無論是按值傳遞或是按引用傳遞,都必須初始設定變數(而在方法中對值傳參數的任何修改都不會帶出到方法外,在方法中對ref 參數作的修改被帶到方法外影響實參,但是這樣的修改可以發生也可以不發生)。而按OUT傳遞,傳遞給方法的變數可以不初始化。但是在該方法中必須對OUT參數賦值(即使在傳給方法之前OUT參數已經初始化,也必須做此操作)。
七,方法重載(overload)?
1, 並沒有overload關鍵字,方法重載是有參數的個數,以及參數的類型來區別的。
2, 兩個方法不能僅在傳回型別上有區別。
3, 兩個方法不能僅根據參數是聲明為ref或out 來區別。
八,方法重載(overload)與方法覆寫(override)的區別
1, 作用的不同:方法重載(overload)是為同一類中的一種方法提供幾種可能的實現方法;而方法覆寫(override)存在於繼承類中,為了實現與父類同一方法的不同實現。
2, 實現方式不同:沒有overload 關鍵字,是通過參數列表來區別不同的方法的
重載Overload特點(兩必須一可以)
public bool withdraw(double amt, string name)
public double withdraw(double amt)
1、方法名必須相同
2、參數列表必須不相同
3、傳回值類型可以不相同
使用關鍵字:override
覆寫Override特點(三相同):
public override bool withdraw(...)
1、方法名相同
2、參數列表相同
3、傳回值類型相同
九 .net程式編譯執行過程
1 編寫程式
2 調試,編譯通過,.net代碼會編譯為MSIL(MS Intermediate Language)
3 然後在運行期間進行正常的JIT(Just In Time)編譯,獲得內部可執行代碼。
十 建構函式與初始化
0建構函式可以定義為private 或protected
1 C#要求所有的變數或對象在使用之前必須初始化(注意:很容易出錯!)。而建構函式做的大多是做初始化的工作。C#中並不是必須為每一個類寫建構函式,一般情況下,如果沒有提供任何建構函式,編譯器會在後台建立一個預設的建構函式。它只是把所有的成員欄位初始化為標準的預設值(如 參考型別:null,數字資料類型為 0,bool 為 false)。
2 如果一個類中沒有定義任何公用或受保護的建構函式,就不能使用new 方法來建立該類的執行個體。這在以下兩種情況下是有用的:
A ,類中緊緊包括靜態成員或屬性,因此永遠不會執行個體化。
B ,希望類僅通過調用某個靜態成員函數來執行個體化。
如:
namespace InforExchangFlat
{
public class ClassSqlDB
{
//定義靜態執行個體
private static ClassSqlDB Instance;
//定義SqlConnection對象
public SqlConnection objConnection =new SqlConnection();
///<summary>
///靜態執行個體初始化函數
///</summary>
static public ClassSqlDB GetInstance()
{
if (Instance == null)
{
Instance = new ClassSqlDB();
}
return Instance;
}
}
}
十一特殊的建構函式
1 靜態建構函式:
C#的一個新特徵是可以給類編寫無參數的靜態建構函式,這種建構函式只執行一次(通常在第一次調用類的成員之前執行)。而一般的建構函式只要建立類的對象就會執行。主要作用:初始化類中靜態欄位和屬性。靜態建構函式沒有存取修飾詞。
如:
using System;
using System.Drawing;
namespace DHCC.Changjia
{
public class UserPreferences
{
public static readonly Color BackColor;
static UserPreferences()
{
DateTime now = DateTime.Now;
if (now.DayOfWeek == DayOfWeek.Saturday
|| now.DayOfWeek == DayOfWeek.Sunday)
BackColor = Color.Green;
else
BackColor = Color.Red;
}
private UserPreferences()
{
}
}
}
2 從其他建構函式中調用建構函式
一個類有多個建構函式,每一個建構函式都要對一些欄位初始化。所有會存在一定量的重複代碼,可以把這些重複代碼寫到一個建構函式中。
如:
Class Car
{
Private string description;
Private uint nWheels;
Public Car(string model,uint nWheels)
{
This.description=model;
This.nWheels=nWheels;
}
Public Car(string model):this(model,4)
{
}
}
十二常量與唯讀欄位的區別
常量(const):已知的,不能修改的值。Const都是靜態,但不能使用static修飾。
唯讀欄位(readonly):不能修改的,但在運行之前其值是未知的,在運行過程中賦予值。唯讀欄位有特定的賦值地區:建構函式,可以在建構函式中經過計算賦值給唯讀欄位,唯讀欄位可以是靜態欄位(一個類只有一個值),也可以是執行個體欄位(每一個執行個體有自己的值)