[學習筆記]
一、簡介
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一起用,表示結束。
