[學習筆記]
一、簡介
1、C#是由Anders Hejlsberg和他的團隊在.Net框架開發期間開發的;是.Net框架的一部分。
C#是專為公共語言基礎結構(CLI)設計的,CLI由可執行程式碼和執行時環境組成,允許在不同計算機平臺和體系結構上使用各種高階語言。
2、C#是大小寫敏感的,每條語句都以 ; 結尾。程式執行從main開始,與Java不同的是,檔名可以不同於類名稱;一個檔案裡可以有多個class;
3、Console.Write() 列印,一次同時列印多個引數可用佔位符{0}...類似於format,後邊用逗號隔開依次要輸入各位的引數;
4、Console.ReadLine() 輸入;
5、Console.ReadKey() 等待按鍵;
6、// 或者 /*...*/ 註釋
7、hello world
1 //hello world ! 2 using System; //使用系統名稱空間 3 namespace HelloWorldApplication //宣告名稱空間 4 { 5 class HelloWorld //class宣告 6 { 7 static void Main(string[] args) /* main 方法 */ 8 { 9 /* 我的第一個 C# 程式*/ 10 Console.WriteLine("Hello World"); 11 Console.ReadKey(); 12 } 13 } 14 }
二、基礎
1、資料型別
1 bool 布林值 2 byte 8位無符號整數(0到255) 3 char 16位Unicod字元 4 decimal 128位精確的十進位制值,28-29位有效數 5 double 64位雙精度浮點型 6 float 32位單精度浮點型 7 int 32位有符號整型 8 long 64位有符號整型 9 sbyte 8位有符號整型 10 short 16位有符號整型 11 uint 32位無符號整型 12 ulong 64位無符號整型 13 ushort 16位無符號整型
可用sizeof(type)方法來獲取一個變數在特定平臺上的準確尺寸;
string 字串可用引號和@引導,用@引導時稱作“逐字字串”,此時轉義字元會被當作普通字元處理,且可進行任意的換行和縮排處理;多個字串可用+號連線
type* name 指標型別
dynamic 動態型別
const 常量
nullable 可空型別(宣告:<data_type> ? <variable_name> = null;合併運算子 ?? 用於定義可空型別和引用型別預設值,如果不為空則為??前邊的值,如果給定值為空,則用??後邊的預設值)
2、資料型別轉換
顯示型別轉換(強制轉換)
double d = 1.23; int x; i = (int)d;
3、內建型別轉換方法
1 ToBooolean 如果可能的話,把型別轉換為布林型 2 ToByte 把型別轉換為位元組型別 3 ToChar 如果可能的話,把型別轉換為單個Unicode字元型別 4 ToDateTime 把型別轉換為時間結構 5 ToDecimal 把浮點型或整數型別轉換為十進位制型別 6 ToDouble 把型別轉換為雙精度浮點型 7 ToInt16 把型別轉換為16位整數型別 8 ToInt32 把型別轉換為32位整數型別 9 ToInt64 把型別轉換為64位整數型別 10 ToSbyte 把型別轉換為有符號位元組型別; 11 ToSingle 把型別轉換為有符號位元組型別 12 ToString 把型別轉換為字串型別 13 ToType 把型別轉換為指定型別 14 ToUInt16 把型別轉換為16位無符號整數型別 15 ToUInt32 把型別轉換為32位無符號整數型別 16 ToUInt64 把型別轉換為64位無符號整數型別
示例:
int i = 5; i.ToSingle(); string locstr = 123.ToString(); //如果要將"locstr"轉成整型數 //方法一: 用 Convert int i = Convert.ToInt16(locstr); //方法二: 用 Parse int ii = int.Parse(locstr);
4、資料裝箱與拆箱
裝箱(值型別轉換為物件型別)
int x = 8; object ob = x;
拆箱(之前由值型別轉換而來的物件型別再轉回值型別)
int x = 9; object ob = x; int y = (int)ob
5、運算子
算術運算子:+,-,*,/,%,++,--
關係運算子:==,!=,>,<,>=,<=
邏輯運算子:&&,||,!
位運算子:&,|,^,~,<<,>>
賦值運算子:=,+=,-=,*=,/=,%=,<<=,>>=,^=,|=
其他運算子:
sizeof() 返回資料型別的大小
typeof() 返回class型別
& 返回變數的地址
* 變數的指標
?: 條件表示式
is 判斷物件是否為某一型別
as 強制轉換,即使失敗也不會丟擲異常
6、陣列(Array)
宣告: datatype[] arrayName;
初始化: double[] a = new double[10],可使用foreach來遍歷陣列:foreach (double i in a)
C#支援多維陣列;在定義一個新陣列時[ ]也可以不給定個數。
7、結構(struct)
struct name { Access_Specifier type name }
C#中結構與C或C++相比有以下特點:
1)結構可帶有方法、欄位、索引、屬性、運算子方法和事件;
2)結構可定義建構函式,但不能定義解構函式;但也不能定義預設的建構函式;
3)與類不同,結構不能繼承其他結構或類的基礎結構;
4)結構可實現一個或多個介面;
5)結構成員不能指定為abstract、virturl或protected;
6)當使用New操作符建立一個結構物件時,會呼叫適當的建構函式來建立結構;但結構可不使用New操作符即可被例項化;
7)如果不使用New操作符,只有在所有的欄位都被初始化之後,欄位才被賦值,物件才被使得;
8、列舉(Enum)
enum <enum_name> { enumeration list }
預設列舉的第一個符號的值是0,但也可以自己指定每個符號的值。
三、控制結構
1、if...else語句
if...else if(boolean_expression){ } else if{ } else{ }
2、switch語句
switch(expression){ case const-expression: statement(a); break; case const-expression: statement(b); break; default: statement(c); break; }
3、while迴圈
while(condition){ statement; }
4、do...while迴圈
do{ statement; }while(condition);
5、for迴圈
for(init;condition;increment){ conditional code; }
6、函式
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body;
}
四、物件導向程式設計(Class)
1、C#的封裝
public 所有物件都可以訪問;
private 物件本身在物件內部可以訪問;
protected 只有該類物件及其子類物件可以訪問;
internal 同一個程式集的物件可以訪問;
protected internal 一個程式集內的物件,或者該類物件及其子類可以訪問;
2、類的定義
<access specifier> class class_name { <access specifier> <data_type> variable_name1; <access specifier> <data_type> variable_name2; ... <access specifier> <return_type> method1(parameter_list){ body; } <access specifier> <return_type> method1(parameter_list){ body; } ... }
3、建構函式
類的一個特殊成員函式,當建立類的新物件時執行;建構函式名稱與類名稱完全相同,但它沒有任何返回型別。
預設的建構函式沒有任何引數,但也可以有引數,這種方法可以幫助在建立物件同時給物件賦初始值。
4、解構函式:
類的一個特殊成員函式,當類的物件超出範圍時執行;
解構函式的名稱是在類的名稱前加上一個 ~ 作為字首,它不返回值,也不帶引數;
解構函式用於在結束程式之前釋放資源。解構函式不能繼承或過載;
5、類的繼承:
class <derived_class> : <base_class>{
}
對於建構函式的繼承需要在引數後加 : baseMethod(parameter_list)
對於宣告為sealed類為密封類,密封類不能被繼承。
C#不支援多重繼承,但可以通過介面來實現。
6、函式過載
在同一個範圍內對相同的函式名有多個定義,但函式的定義必須彼此不同,可以是引數型別不同,也可以是個數不同,但不能只有返回型別不同。
7、動態多型性(抽象類和虛方法)
使用abstract關鍵字建立抽象類,用於提供介面的部分類的實現。當一個派生類繼承自該抽象類時,實現即完成;抽象類包含抽象方法,抽象方法可被派生實現;
繼承一個抽象方法時用override宣告;
不能建立一個抽象類的例項;
不能在一個抽象類外部宣告一個抽象方法;
抽象類不能被宣告為sealed。
虛方法用virtual宣告,在不同的繼承類中有不同的實現,對虛方法的呼叫是在執行時發生的。
8、運算子的過載
在類中對運算子的重新定義,通過關鍵字operator+運算子 來定義的;
只有算術運算子和比較運算子可以被過載。
9、介面(interface)
介面定義了所有類繼承介面時應遵循的語法合同,定義了屬性、方法和事件;介面使得實現介面的類或結構在形式上保持一致。
介面使用interface宣告,後邊接介面名稱即可。
介面的繼承和類一樣,類繼承介面時必須先在static void main()中例項一個當前的類,然後呼叫介面的方法,再實現介面的方法。
附:
1、名稱空間(namespace)
用於提供一種讓一組名稱與其他名稱分隔開的方式。在同一程式內使用多個名稱空間,在呼叫其他的類或方法時需用名稱空間名後跟 . 進行定位區分。
也可以使用using來提前名稱空間。(using還可以用於給很長的路徑起別名)
名稱空間可以進行巢狀。
2、前處理器指令:
1 #define 定義一系列成為符號的字元; 2 #undef 取消定義符號; 3 #if 測試符號是否為真; 4 #else 與#if一起使用; 5 #elif 與#if一起使用; 6 #endif 指定一個條件指令的結束; 7 #line 修改編譯器的行數及輸出錯誤和警告的檔名; 8 #error 允許程式碼的指定位置生成一個錯誤; 9 #warning 允許程式碼的指定位置生成一級警告; 10 #region 指定一個可展開或摺疊的程式碼塊; 11 #endregion 與#region一起用,表示結束。