【C#】C#基礎學習筆記

【C#】C#基礎學習筆記


由於之前用過幾年C/C++,現只針對C#的差異或C/C++遺忘的知識點學習總結。


1、數據類型:
值類型:和C/C++類似。
指針類型:和C/C++類似。
引用類型:
對象(Object)類型:是所有數據類型的終極基類。Object是System.Object類的別名。當一個值類型轉換爲對象類型時,則被稱爲裝箱;另一方面,當一個對象類型轉換爲值類型時,則被稱爲 拆箱。
動態(Dynamic)類型:可以存儲任何類型的值在動態數據類型變量中。這些變量的類型檢查是在運行時發生的。
動態類型與對象類型相似,但是對象類型變量的類型檢查是在編譯時發生的,而動態類型變量的類型檢查是在運行時發生的。
字符串(String)類型:給變量分配任何字符串值。字符串(String)類型是System.String類的別名。它是從對象(Object)類型派生的。字符串(String)類型的值可以通過兩種形式進行分配:引號和 @引號。
String str = "w3cschool.cc";
@"w3cschool.cc";
C# string 字符串的前面可以加 @(稱作"逐字字符串")將轉義字符(\)當作普通字符對待,比如:
string str = @"C:\Windows";
等價於:
string str = "C:\\Windows";

2、定義常量:
C#不支持宏定義,只支持編譯開關。所以不能通過#define PI 3.14的方式來定義常量(C/C++可以)
const double pi = 3.14159; // 局部常量
public static const double pi = 3.14159; // 全局常量

3、雜項運算符:
sizeof()返回數據類型的大小。
typeof()返回class的類型。typeof(StreamReader)。
&返回變量的地址。&a將得到變量的實際地址。
*變量的指針。*a將指向一個變量。 
? :條件表達式 如果條件爲真 ? 則爲 X : 否則爲 Y 
is判斷對象是否爲某一類型。If( Ford is Car) // 檢查 Ford 是否是 Car 類的一個對象。
as強制轉換,即使轉換失敗也不會拋出異常。
Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;

4、對象的封裝和訪問修飾符:
public:允許一個類將其成員變量和成員函數暴露給其他的函數和對象。任何公有成員可以被外部的類訪問。
private:允許一個類將其成員變量和成員函數對其他的函數和對象進行隱藏。只有同一個類中的函數可以訪問它的私有成員。
protected:允許子類訪問它的基類的成員變量和成員函數。這樣有助於實現繼承。
Internal:允許一個類將其成員變量和成員函數暴露給當前程序中的其他函數和對象。同一個項目中可訪問,不同項目中不可以訪問。

5、方法調用的參數傳遞:
值參數:這種方式複製參數的實際值給函數的形式參數,實參和形參使用的是兩個不同內存中的值。在這種情況下,當形參的值發生改變時,不會影響實參的值,從而保證了實參數據的安全。
引用參數:這種方式複製參數的內存位置的引用給形式參數。這意味着,當形參的值發生改變時,同時也改變實參的值。使用ref關鍵字:n.swap(ref a, ref b);
輸出參數:相比於return只能返回一個值,輸出參數可以返回多個值。使用out關鍵字:n.getValues(out a, out b);

6、可空類型和null合併運算符:
nullable 類型(可空類型),可空類型可以表示其基礎值類型正常範圍內的值,再加上一個null值。
int? num1 = null; //定義可空int類型變量num1,值爲null
double? num3 = new double?(); //定義可空double類型變量num3,值爲null(new double?()值爲null)
null合併運算符:如果第一個操作數的值爲 null,則運算符返回第二個操作數的值,否則返回第一個操作數的值。
double? num1 = null;
double num2;
num2 = num1 ?? 5.34; //值爲5.34

7、使用foreach循環遍歷數組:
int []  n = new int[10]; /* n 是一個帶有 10 個整數的數組 */
foreach (int j in n )
{
    Console.WriteLine("{0}", j);//打印數組元素
}

8、類的靜態成員和靜態函數:
靜態成員:static關鍵字把類成員定義爲靜態的。當我們聲明一個類成員爲靜態時,意味着無論有多少個類的對象被創建,只會有一個該靜態成員的副本。
靜態函數:成員函數聲明爲static。這樣的函數只能訪問靜態變量。靜態函數在對象被創建之前就已經存在。

9、繼承:C#不支持多重繼承。但是可以使用接口來實現多重繼承。
class Shape{}
public interface PaintCost{}
class Rectangle : Shape, PaintCost{}//實現多重繼承,一個類,一個接口。

10、多態性:
多態性意味着有多重形式。在面向對象編程範式中,多態性往往表現爲"一個接口,多個功能"。
靜態多態性:函數重載,運算符重載。函數的響應是在編譯時發生的。
函數重載:根據函數參數類型,參數個數來調用不同的實現方法。
運算符重載:關鍵字operator後跟運算符的符號來定義
public static Box operator+ (Box b, Box c){}//定義Box的加法運算。使用的時候 Box1 + Box2 既可以實現我們自己實現的方法。
動態多態性:抽象類(abstract ),虛方法(virtual )。函數的響應是在運行時發生的。
密封類:關鍵字sealed。當一個類被聲明爲sealed時,它不能被繼承。抽象類不能被聲明爲sealed。
抽象類:用於提供接口的部分類的實現。當一個派生類繼承自該抽象類時,實現即完成。不能創建一個抽象類的實例。不能在一個抽象類外部聲明一個抽象方法。不能被聲明爲密封類。
虛方法:虛方法可以在不同的繼承類中有不同的實現。派生類中使用override關鍵字來申明實現虛方法。

11、接口:
關鍵字interface。接口聲明默認是public的。接口定義了屬性、方法和事件,這些都是接口的成員。接口只包含了成員的聲明。成員的定義是派生類的責任。接口提供了派生類應遵循的標準結構。
public interface ITransactions{}//定義接口

12、命名空間:
設計目的是爲了提供一種讓一組名稱與其他名稱分隔開的方式。在一個命名空間中聲明的類的名稱與另一個命名空間中聲明的相同的類的名稱不衝突。
定義:namespace namespace_name{}
使用:using System;//在程序開頭申明使用系統提供的System命名空間。之後直接可以調用System命名空間中的類和方法,否則需要在前面顯示加上System.來使用。
嵌套命名空間定義:
namespace namespace_name1 
{
   // 代碼聲明
   namespace namespace_name2 
   {
     // 代碼聲明
   }
}
嵌套命名空間使用:
using first_space;
using first_space.second_space;

13、C#支持正則表達式。
using System.Text.RegularExpressions;
Regex類裏面包含所有的正則表達的方法實現。

14、異常處理:
關鍵字:try、catch、finally、throw
try:一個try塊標識了一個將被激活的特定的異常的代碼塊。後跟一個或多個catch塊。
catch:程序通過異常處理程序捕獲異常。catch關鍵字表示異常的捕獲。
finally:finally塊用於執行給定的語句,不管異常是否被拋出都會執行。例如,如果您打開一個文件,不管是否出現異常文件都要被關閉。
throw:當問題出現時,程序拋出一個異常。使用throw關鍵字來完成。
用戶自定義異常:用戶自定義的異常類是派生自ApplicationException類
定義:
public class TempIsZeroException: ApplicationException
{
   public TempIsZeroException(string message): base(message)
   {
   }
}
拋出:throw (new TempIsZeroException("Zero Temperature found"));

15、文件IO:
using System.IO


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章