1. 程式人生 > >C#基礎知識(學習之路)

C#基礎知識(學習之路)

第一部分:OOP

一. 變數與表示式

1.值型別:

(1).整數型別:sbyte(signed:有正負之分的)、byte、short、ushort(unsigned)、int、uint、long、ulong
(2).浮點型別:float、double、decimal
(3).文字和布林型別:char(一個Unicode字元,儲存0—65535之間的整數)、bool
(4). 結構型別:sruct(point、size、datetime)
(5). 列舉型別:enum

2.引用型別:

(1).類型別:class:string(字串類)
(2).介面型別:interface
(3).委託型別:delegate
(4).陣列型別:array

3. 運算子

(優先順序從高到低)
(1).++、-- (用作字首)、+、- (一元)
(2).* 、/、%
(3).+、-
(4).=、*=、/=、%=、+=、-=
(5).++、-- (用作字尾)

4.陣列

(1).宣告一維陣列:(三段程式碼效果一致),如下:

            int[] a = new int[3];
            a[0] = 3;
            a[1] = 5;
            a[2] = 9;
            int[] a = {3,5,9 };
            int[] a = new int[] { 3, 5, 9 };

注意:陣列是引用型別,它的元素相當於類的成員變數,因此陣列一經分配空間,其中的每個元素也被按照成員變數同樣的方式隱式初始化(數值型別是0;引用型別是null)

(2).foreach迴圈

            foreach (< baseType > < name > in < array >) {
                body_statement;
            }

注意:foreach是隻讀式遍歷

(3).宣告二維陣列,如下:

            int[,] a = { { 1,5,9},{ 2,5,9 },{ 3,5,9 } };

getlength()方法的使用:如下:

            a.GetLength(0),a.GetLength(1)//獲取各個維度的長度

二.流程控制

1.switch:

            switch (exp) {
                case const1:
                    statement1;
                    break;
                case const2:
                    statement2;
                    break;
                    ......
                case constN:
                    statementN;
                    break;
                default:
                    statementN_default;
                    break;
            }

注意:不能隨便貫穿,必須有break;除非幾個case連起來,中間沒有別的語句

2.for:

包含:初始化部分、迴圈條件部分、迭代部分、迴圈體部分

            for (init_statement;test_exp;alert_statement) {
                body_statement
            }

3.while:

(包含:初始化部分、迴圈條件部分、迴圈體部分、迭代部分)

            [init_statement]
            while (test_exp) {
                body_statement;
                [alter_statement;]
            }

注意:當迴圈不是特別規則的時候,大多選用while

4.迴圈的中斷

break:立即終止迴圈
continue:立即終止當前的迴圈(繼續執行下一次迴圈)
return:跳出迴圈及包含該迴圈的函式

三、類

寫程式就是寫類

1.欄位、方法

寫類就是寫變數和函式,而欄位就是變數,方法就是函式

構造方法(constructor):構造方法的主要作用是完成物件的初始化
(1)構造方法的方法名與類名相同
(2)構造方法沒有返回型別,也不能寫void
初始化最常見的任務就是把帶進來的引數賦值到欄位裡面去,如下:

    	public Person(string n,int a){
        	name=n;
        	age=a; 
   		} 

預設構造方法:如果使用者沒有定義任何構造方法,則系統會自動產生一個publlic Person(){}

析構方法:由於C#自動進行物件的釋放,所以使用者一般不定義析構方法

this:指這個物件本身,常用於:
(1)訪問這個物件的欄位和方法
(2)區分欄位和區域性變數
(3)用於構造方法呼叫另一個構造方法,注意其位置,如下:

        public Person():this(0,"")(){
        //  構造方法的其他語句;
        }

2.屬性(property)、索引(indexer)

:對欄位和方法的擴充
屬性的書寫:如下:

        private string _name;
        public string Name
        {
            get{
                    return _name;
                }
            set{
                    _name = value;//value表示傳進來的引數
                }
        }

屬性可簡寫為: 如下:

        public string Name { set; get; }

對屬性進行訪問:如下:

        Person p = new Person();
        p.Name= "Li Ning";//set
        console.WriteLine(p.Name);//get

屬性與欄位的比較:
(1)屬性可以只讀(只有get)或者只寫(只有set)
(2)屬性可以進行有效性檢查:if…
(3)屬性可以計算得到的資料:如下:

        public string Info {
            get{ return "Name:" + Name + ",Age:" + Age; }
                }

(4)可以定義抽象屬性

索引的定義:如下:

        修飾符 型別名 this[引數列表]
        {
                set
                {
                }
                get
                {
                }
         }

3.類的繼承

C#採用單繼承,所
有的類都直接或者間接的繼承至object類
除了繼承父類的成員外,子類還可以:新增新的成員,隱藏或修改父類的成員

欄位隱藏:如下:

		class A{
			public int a;
		}
		class B:A
		{
			new public int a;//new
		}

與父類同名的方法
(1)定義同名、但引數列表與父類不用的方法,這稱為對父類方法的過載(overloading)
(2)定義同名且引數列表也與父類相同的方法,這稱為新增加一種方法,用new表示
(3)定義同名且引數列表也與父類相同的方法,而且父類的方法用了abstractvirtual進行了修飾,子類的同名方法用了override進行了修飾,這稱為虛方法的覆蓋(overriding)

base
(1)修改父類方法的同時,又利用了父類的方法:如下:

		void sayHello(){
			base.sayHello();
			console.WriteLine("My school is:"+ school);
		}

(2)定義構造方法的同時,呼叫父類的構造方法,最後再增加一些資訊:如下:

		Student(string name,int age,string school)
		{
			this.school=school;
		}

as運算子:常用於父類與子類的轉換,如下:

		Student s3 = p1 as Student;//	被如果能轉換,s3被賦值;如果不能轉換,s3的值為null

注意:as只能應用於引用型別,與強制型別轉換有區別

is運算子:判斷一個物件是不是某個類(及其子類)的例項,如下:

		if(p is Person)

4.修飾符

訪問修飾符:public、private、internal、protected

static(靜態的)
static的欄位、方法、屬性是屬於整個類的,而不是某一個例項的。所以不能使用this…(與this相對)
static變數可以用來表示"全域性變數"

const與readonly
const相當於靜態常量,如Math.PI
readonly相當與不可改量,只能賦一次值,如String.Empty。在構造方法中賦值,或者在宣告時就賦值。
注意:const只能用於基本及string
readonly只能修飾字段,而const還可以修飾區域性變數

sealed與abstra
sealed類,不可繼承
abstract類,不可例項化

5.介面(interface)

:幫助實現多重繼承
(1)定義一個介面:介面是一系列方法,如下:

		public interface IStringList
		{
			void Add(string s);//普通的方法
			int Cout{get;}//比較特殊的方式;屬性
			string this [int index]{get;set;}//比較特殊的方式:索引器
		}

注意:public abstract 這兩個關鍵字不寫出來
(2)實現介面:如下:

		class 類名:[父類] ,介面,介面,介面
		{
			public 方法(){
				//定義的時候沒有實現,現在將它具體實現
			}

6.結構和列舉

(1)struct:值型別
每個欄位在定義時,不能給初始值
構造方法中,必須給每個欄位進行賦值
是sealed的,是不能被繼承
如下:

		struct Point
		{
			public double x,y;
			public Point(int x,int y){
				this.x=x;
				this.y=y;
			}
			public double R(){
			return Math.Sqrt(x*x+y*y);
			}
		}

(2)列舉:本質是有意義的整數,如下:

		enum MyColor    //後面可以跟一個	:int
		{
			Red,
			Green=1,
			Blue=2
		}

賦值與比較:如下:

MyColor c=MyColor.Red;
if(c==MyColor.Red)
switch(c){case MyColor.Red:*********}

與字串的轉換:如下:

Console.WriteLine(c.ToString());//轉成紅綠藍
c=(MyColor )Enum.Parse(typeof(MyColor),"Red");

四、C#高階特性

1.委託

大體上相當於函式指標,但它型別更安全,是引用型別
C#定義了很多的委託:

Action<T1,T2>
Func<T1,T2,Tresult>;如:new Func<double,double>(Math.Sin);

委託具有多播的功能:使用運算子±,+=,-=,可以動態地增減其中的函式,提高了程式的靈活性

2.事件

大致上相當於回撥函式,事件的型別是一個委託
事件的宣告:public event 委託名 事件名;
事件的註冊與移除:事件名+=或-=(在事件所在類的外面,只能用以上兩個運算子)
事件的發生(激發):事件名(引數列表)

3.lamda表示式:

4.運算子過載:

5.異常處理:

try{......}
catch(Exception e1){......}
catch(Exception e2){......}
catch(最一般的Exception e){}
finally{......}	//無論怎麼樣都會走到這裡來,甚至包括try裡面有return

五、基礎類及常用演算法

1.型別轉換

任何事物都是object類的子類,任何物件都有一下方法:ToString()、 Equals(), GetType()、 MemberwiseClone()等
型別轉換函式:System.Convert、 int.Parse(string)、 int.TryParse(string)

2.幾個常用類

:數字、文字、日期

(1)Math類:提供了相關的數學方法
Abs() //絕對值
Sin()、 Cos()、 Tan()
Round() //四捨五入
Exp()、 log()//對數指數
Pow() //乘方

(2)Random類:得到的都是偽隨機數
.Next(100) //0到100之間,不含100
.NextDouble() //0到1之間

(3)DateTime:是值型別
new DateTime(y,m,d,h,m,s)
.Now
.ToString(“yyyy-MM-dd HH:mm:ss”)
.AddMinute(5)
.Year、 .Month、 .Day、 .Date
TimeSpan //兩個日期相減,可以得到一個TimeSpan

(4)String類:
==(內容是否相等)、 +(連線)、 [];
.Lenth()//長度、 .Indexof()取下標 、 .LastIndexof()//反向去查詢;
.StartWith()//使…開始、 .EndsWith;
.Substring(idx,len)//求字串,注意第二個引數;
.Trim()//去空格 、 .TrimEnd()//去掉末尾空格 、 .PadLeft()//左邊填充空格、 .Insert () 、 .Remove();
.Split(’;’)//分割 、 string.Join//可以把字串連線起來;

(5)String及StringBuilder
String內容不可變
StringBuilder內容可變:.Append、 .Remove 、 .Replace 、 .Length 、 .ToString

3.陣列、集合、泛型

(1)陣列:控制長度,控制型別

(2)集合:不控制長度,不控制型別
System.Collections名稱空間;
Arraylist:相當於動態陣列,實現IList;
Hashtable:相當於鍵/值的集合,實現IDictonary; 用[]進行訪問,表示獲取、增加、刪除、修改; 用於查詢時,比線性搜尋效率更高,可用於程式的優化;
Stack和Queue:

(3)泛型:不控制長度,控制型別
具有更好的型別檢查和效能;
System.Collections.Generic名稱空間;
列表:List/LinkedList SortedList
List的Add方法,Count屬性,[i]索引器
foreach的遍歷;
字典:Dictionary SortedDictionary;
集:HashSet SortedSet
Hashtable的[]索引,可以表示獲取/加入/修改/刪除(置為null)
foreach的遍歷;
Stack,Queue;

(4)使用foreach訪問陣列和集合

 

4.常用演算法:遍試、迭代、遞迴