C#菜鳥教程筆記
筆記會持續更新,有錯誤的地方歡迎指正,謝謝!
一、基礎
0.輸入輸出
函式 Console.ReadLine(),用於接收來自使用者的輸入,並把它儲存到一個變數中
Console.WriteLine(“Length: {0}”, length);//輸出
Console.WriteLine(“Hello World”);//輸出
1.C# 資料型別
引用型別(Reference types):指的是一個記憶體位置。
物件(Object)型別:當一個值型別轉換為物件型別時,則被稱為 裝箱;另一方面,當一個物件型別轉換為值型別時,則被稱為 拆箱。
之前由值型別轉換而來的物件型別再轉回值型別
int val= 8;
object obj = val;//先裝箱
int nval = (int)obj;//再拆箱
字串(String)型別:
C# string 字串的前面可以加 @(稱作”逐字字串”)將轉義字元(\)當作普通字元對待,比如:
string str = @"C:\Windows";
//等價於:
string str = "C:\\Windows";
2.C# 型別轉換
• 隱式型別轉換 - 這些轉換是 C# 預設的以安全方式進行的轉換, 不會導致資料丟失。例如,從小的整數型別轉換為大的整數型別,從派生類轉換為基類。
long lnum = inum;//隱式轉換,將int型資料轉換為了long型的資料
Class1 c1 = new Class2();//隱式,將一個新建的Class2例項轉換為其基類Class1的例項c1
• 顯式型別轉換 - 即強制型別轉換。顯式轉換需要強制轉換運算子,而且強制轉換會造成資料丟失。
string locstr = 123.ToString();//整數轉字串
int ii = int.Parse(locstr);// 字串轉整數
Class1 c11 = new Class1();
Class2 c22 = c11 as Class2; //使用as進行顯式轉換
int ifromd = (int)dnum; //double型別顯式轉換轉為int型別
3.C# 封裝
封裝使用 訪問修飾符 來實現
public 公有訪問。不受任何限制。
private 私有訪問。只限於本類成員訪問,子類、例項都不能訪問。
protected 保護訪問。只限於本類和子類訪問,例項不能訪問。
internal 內部訪問。只能在當前專案的內部訪問,出了這個專案就訪問不到了!
protected internal 內部保護訪問。就是protected和internal的結合 當前專案的當前類和子類才能訪問
C#成員型別的可修飾及預設修飾符如下表:
成員型別 | 預設修飾符 | 可被修飾符 |
---|---|---|
enum | public | none |
class | private | public、protected、private、internal、protected internal |
interface | public | none |
struct | private | public、private、internal |
Private 訪問修飾符
只有同一個類中的函式可以訪問它的私有成員。即使是類的例項也不能訪問它的私有成員。
Protected 訪問修飾符
Protected 訪問修飾符允許子類訪問它的基類的成員變數和成員函式。這樣有助於實現繼承。
4.C# 方法
按值傳遞引數
這是引數傳遞的預設方式。在這種方式下,當呼叫一個方法時,會為每個值引數建立一個新的儲存位置。
按引用傳遞引數(ref用於宣告引用引數)
引用引數是一個對變數的記憶體位置的引用,使用 ref 關鍵字宣告引用引數。
當按引用傳遞引數時,與值引數不同的是,它不會為這些引數建立一個新的儲存位置。
void Start () {
int a = 100;int b = 200;
print(a +"\n"+ b);
Swap(ref a, ref b);
print(a +"\n"+ b);
}
public void Swap(ref int x,ref int y)
{
int temp;
temp = x;x = y;y = temp;
}
按輸出傳遞引數(輸出引數out a)
1. return 只返回一個值, 使用 輸出引數 來從函式中返回兩個值。
2. 主方法中不需要賦值,當需要從一個引數沒有指定初始值的方法中返回值時,輸出引數out特別有用。
void Start ()
{
int a, b;
ValueTrue(out a, out b);
Debug.Log(a + "\n" + b);
}
private void ValueTrue(out int x,out int y)
{
x = 100;y = 200;
}
也就是,out形參類似於ref形參,但它只能用來將值從方法中傳出。在呼叫之前,並不需要為out形參的變數賦予初始值。在方法中,out形參總是被認為是未賦值的,但在方法結束前必須賦於形參一個值。因此,當呼叫方法後,out形參引用的變數會包含一個值。
5.C# 陣列(Array)
foreach 語句用於迴圈訪問集合以獲取所需資訊,但不應用於更改集合內容以避免產生不可預知的副作用。
所以,foreach()方法中不能對變數進行賦值,但可以讀數組裡面的元素來用
6.C# 字串(String)
string [] ab = { "s", "b" };
string cd = string.Join(" ", ab);
print(cd);//輸出 s b
7.C# 結構(Struct)
結構可定義非預設型建構函式,建構函式和解構函式相反,解構函式專做善後工作
補:C#介面好比一種模版,這種模版定義了物件必須實現的方法
結構是值型別資料結構。它使得一個單一變數可以儲存各種資料型別的相關資料。struct 關鍵字用於建立結構。
struct Books
{
public string title;
…
}; //C#中struct後面的分號可加可不加,而C++中struct後面的分號必須加。
Books Book1;
Book1.title = "C Programming";
8.C# 列舉(Enum)
用enum做Unity中的下拉列表:
public RotateWays a=RotateWays.rightRotate;
public enum RotateWays
{
leftRotate,
rightRotate,
RLBothRotate
};
9.C# 類(Class)
定義了一個類就是定義了一個數據型別
解構函式用於在結束程式(比如關閉檔案、釋放記憶體等)之前釋放資源。解構函式不能繼承或過載。用法:~Line() //解構函式
建構函式分為兩種
C# 類的靜態成員
直接呼叫類而不需要建立類的例項來獲取。靜態變數可在成員函式或類的定義外部進行初始化。您也可以在類的定義內部初始化靜態變數
您也可以把一個成員函式宣告為 static。這樣的函式只能訪問靜態變數。靜態函式在物件被建立之前就已經存在。
public static int num;
public static int getNum()
{
return num;
}
10.C# 繼承
利於重用程式碼和節省開發時間,利於維護
一個類可以派生自多個類或介面,這意味著它可以從多個基類或介面繼承資料和函式。
最多隻能繼承一個基類或一個介面,也可以同時繼承上面兩個
介面:
public interface PaintCost
{
int getCost(int area);
}
基類:
class Shape
{
public void setWidth(int w)
{
width = w;
}
public void setHeight(int h)
{
height = h;
}
protected int width;
protected int height;
}
子類:
class Rectangle : Shape, PaintCost
{
public int getArea()
{
return (width * height);
}
public int getCost(int area)
{
return area * 70;
}
}
主動類:
例項化後,賦值給介面的變數,呼叫即可
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
Console.WriteLine("油漆總成本: ${0}" , Rect.getCost(area));
11.C# 多型性
靜態多型性
• 函式過載(相同的函式不同功能)
• 運算子過載(重定義或過載 C# 中內建的運算子)
動態多型性
動態多型性是通過 抽象類(使用關鍵字abstract 宣告) 和 虛方法(使用關鍵字 virtual 宣告) 實現的
12.C# 介面(Interface)
介面提供了派生類應遵循的標準結構,介面中只用寫方法型別和方法名
13.C# 名稱空間(Namespace)
1.名稱空間的設計目的是提供一種讓一組名稱與其他名稱分隔開的方式。即在一個名稱空間中宣告的類的名稱與另一個名稱空間中宣告的相同的類的名稱不衝突。
2.using XXX的作用
using UnityEngine.UI;可以不寫,如果這樣的話:
UnityEngine.UI.Text text2;
void Start ()
{
text2.text = "00";
}
3.自定義名稱空間,名稱空間裡裝的是 類:
namespace first_space
{
class namespace_cl
{
public void func()
{
Console.WriteLine("Inside first_space");
}
}
}
14.C# 正則表示式
用於匹配輸入文字
15.C# 異常處理(同Java,瞭解)
16.C# 檔案的輸入與輸出
二、高階
1.C# 屬性
有get;set訪問器:獲取屬性時,會執行get模組。給屬性賦值時,會執行set模組。
若沒有寫set,也就是說外界是不能修改的。
訪問器(accessor)宣告可包含一個 get 訪問器、一個 set 訪問器,或者同時包含二者。
用法:
// 宣告型別為 string 的 Code 屬性
public string Code
{
get
{
return code;
}
set
{
code = value;
}
}
在一個方法裡直接用就好:
比如:
return "Code = " + Code;//呼叫get()
s.Code = "001";//例項化後,呼叫set()
2.C# 索引器
讓物件以類似陣列存取的方式來存取,也就是允許一個物件可以像陣列一樣被索引。當您為類定義一個索引器時,該類的行為就會像一個 虛擬陣列(virtual array) 一樣。您可以使用陣列訪問運算子([ ])來訪問該類的例項。
和屬性的區別:
屬性返回或設定一個特定的資料成員,而索引器返回或設定物件例項的一個特定值。換句話說,它把例項資料分為更小的部分,並索引每個部分,獲取或設定每個部分。
定義一個屬性(property)時包括提供屬性名稱(public string Code)。索引器定義的時候不帶有名稱(public string this[int index]),但帶有 this 關鍵字,它指向物件例項。索引器類似於屬性,不同之處在於它們的取值函式採用引數。例子:
public class Person
{
private string _name = “No one”;
public Person(string name)
{
_name = name;
}
//未完
};
在上面Person類裡新增一個索引器:
public string this[string key]
{
get { if (key == "Name")
return _name;
return null;}
set { if (key == "Name")
_name = value;
return;}
}
跟屬性一樣,索引器可以只有set訪問器或者get訪問器,或者二者都有,不過,索引器可輸入引數。
用法:
Person p = new Person ("Arya");
p ["Name"] = "Anonymous";
System.Console.WriteLine (p ["Name"]);
3.C# 委託
委託是用於引用與其具有相同標籤的方法
一個物件被一個委託例項化去執行某個方法
C# 中的委託(Delegate)類似於 C 或 C++ 中函式的指標。委託(Delegate) 是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。
委託(Delegate)特別用於實現事件和回撥方法。換句話說,可以使用委託物件呼叫可由委託引用的方法。
4.C# 不安全程式碼
當一個程式碼塊使用 unsafe 修飾符標記時,C# 允許在函式中使用指標變數。不安全程式碼或非託管程式碼是指使用了指標變數的程式碼塊。
5.C# 多執行緒
執行緒 被定義為程式的執行路徑。
如果您的應用程式涉及到複雜的和耗時的操作,那麼設定不同的執行緒執行路徑往往是有益的,每個執行緒執行特定的工作。