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)定義同名且引數列表也與父類相同的方法,而且父類的方法用了abstract或virtual進行了修飾,子類的同名方法用了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.常用演算法:遍試、迭代、遞迴