.NET
微軟的.Net既不是編程語言也不是框架,是類似于互聯網時代、次時代、21世紀、信息時代之類的宣傳口號,是一整套技術體系的統稱,或者說是微軟提供的技術平臺的代號.
1.跨語言
只要是面向.NET平臺的編程語言(C#、VB、 C++、 F#等等),用其中一種語言編寫的內容可以無縫地用在另一種語言編寫的應用程序中
CLS:一種語言互操作的便準規范
CLI :公共語言基礎結構。是微軟將CTS等內容提交給國際組織計算機制造聯合會ECMA的一個工業標準
2.跨平臺
一次編譯, 不需要任何代碼修改,應用程序就可以運行在任意有.NET框架實現的操作系統上,即代碼不依賴于操作系統,也不依賴硬件環境
.net Framework:
體系結構
制作應用程序
編程語言+調用各種類庫進行開發生成程序集
????????1.只要支持CLS公共語言規范的語言都可以用于開發Windows下的各種應用程序和網站程序
????????2.BCL (基礎類庫)和FCL (框架類庫)是這個框架體系中為我們實現好的各種API
????????3.程序集的表現就是后綴為.dll或者exe格式的文件
.Net Framework是一個主要用于跨語言開發Windows操作系統下的應用程序的框架結構,并不支持跨平臺
.net Core
?是.Net Framework的翻版實現,它是一個開源項目,是基于.Net Framework來進行設計的主要目的就是跨平臺,是.Net技術框架組成在Windows、MacOS、 類Linux系統 下的具體實現
Mono
相對.Net FrameWork最大的區別就是具備跨平臺的能力,不僅可以運行在Windows、MacOS、Linux等操作系統,甚至還可以運行在PS3、XBOX、Wii等主機平臺上
Mono與Unity
Unity Engine ?:
提供UnityEngine.dlI動態庫,各平臺不同,C/C+ +編寫,包含平臺相關代碼、圖形API、物理引擎、燈光等等所有游戲引擎底層內容
Unity Editor (編輯器)
提供UnityEditor.dII動態庫,大部分由C#編寫,用戶腳本最初可以使用C#、JavaScript、Boo語言編寫, 項目代碼最后由Mono編譯
Mono主要構成部分:
1.C#編譯器(mcs)
2.Mono Runtime類似CLR公共語言運行時(虛擬機)包括JIT (Just in time)即時編譯器、AOT (Ahead of time)提前編譯器、GC、類庫加載器等等
3.BCL基礎類庫
4.Mono類庫:提供很多超出.Net的一些額外功能,主要用于構建各種操作系統上的應用
C# 命名與可選參數、動態類型語法
Test(f:3.3f ,i:5 ,b:false);
//每個參數可以按照參數名字進行指定public void Test(int i,float f,bool b){}//可以配合可選參數的使用,跳過一些默認參數,直接賦值后面的默認參數
lu(1,s:"234");
public void lu(int i,bool b=false,string s="456"){}//動態類型
//dynamic 只在編譯時存在,運行時不存在
//需要將UNity的.NET API兼容級別切換到.NET 4.x
//IL2CPP不支持C# dynamic關鍵字 ,且無法自動補全dynamic dyn =1;
object ji=2;
print(ji.GetType());
print(dyn.GetType());
//輸出都是INT32
線程與線程池
UNITY中的線程:
????????1. Unity支持多線程
????????2. Unity中開啟的多線程不能使用主線程中的對象
????????3. Unity中開啟多線程后一定要關閉
Thread t = new Thread (()=>{while(true){print("HFUTER");Thread.Sleep(1000);}});t.Start();
線程池
命名空間:System.Threading
類名:ThreadPool(線程池)
ThreadPool中有若干數量的線程,如果有任務需要處理時,會從線程池中獲取個空閑的線程來執行任務,任務執行完畢后線程不會銷毀,而是被線程池回收以供后續任務使用。當線程池中所有的線程都在忙碌時,又有新任務要處理時,線程池才會新建一個線程來處理該任務 ,如果線程數量達到設置的最大值,任務會排隊,等待其他任務釋放線程后再執行,線程池能減少線程的創建,節省開銷,可以減少GC垃圾回收的觸發
但是不能控制線程池中線程的執行顧序,也不能獲取線程池內線程取消/異常/完成的通知
//獲取可用的工作線程數和I/O線程數
int num1;
int num2;
ThreadPool.GetAvailableThreads(out num1,out num2);//獲取最大可用的工作線程數和I/O線程數
ThreadPool.GetMaxThreads(out num1,out num2);ThreadPool.SetMaxThreads(20,20);
//設置最多開20個線程ThreadPool.GetMaxThreads(out nums1,out num2);
(線程池里的線程?就是一個個沒有運行的?線程對象不存在關閉這一說)
Task 任務類
Task是在線程池基礎上進行的改進,擁有線程池的優點,解決了使用線程池不易控制的弊端
是基于線程池的優點對線程的封裝,可以更方便高效的進行多線程開發
一個Task對象就是一個線程
?創建Task
//無返回值
Task t1 =new Task(()=>{while(true){print("HFUTER");
Thread.Sleep(1000);
//1s
}
});
//是基于線程池規則的Task t2 =Task.Run(()=>{while(true){print("HFUTER2");
Thread.Sleep(1000);
//1s
}
});Task.Factory.StartNew(()=>{while(true){print("HFUTER3");
Thread.Sleep(1000);
//1s
}
});//有返回值
Task <int>t11 =new Task<int>(()=>{while(true){print("HFUTER");
Thread.Sleep(1000);
//1s
}
return 1;
});Task<string> t21 =Task.Run<string>(()=>{while(true){print("HFUTER2");
Thread.Sleep(1000);
//1s
}
return "yuan";
});Task<float>t33 = Task.Factory.StartNew<float>(()=>{while(true){print("HFUTER3");
Thread.Sleep(1000);
//1s
}return 4.5f;
});
注意:Result獲取結果時會阻塞線程
//同步執行
Task t =new Task(()=>{Thread.Sleep(1000);
});
t.RunSynchronously();//wait方法,等待任務執行完畢,再執行后面的內容
Task lu =new Task(()=>{Thread.Sleep(1000);
});Task ji =new Task(()=>{Thread.Sleep(1000);
});lu.Wait();//WaitAny
Task.WaitAny(lu,ji);
//至少一個任務完成才會執行后面的邏輯
異步方法async和await
async和await一般需要配合Task進行使用
async用于修飾函數、lambda表達式、 匿名函數
await用于在函數中和async配對使用,主要作用是等待某個邏輯結束,此時邏輯會返回函數外部繼續執行,直到等待的內容執行結束后,再繼續執行異步函數內部邏輯
在一 個async異步函數中可以有多個await等待關鍵字
public async void TestAsync(){print("123");
//不能使用ref和out關鍵字await Task.Run(()=>{});}
資源異步加載可以是使用async和await
不過unity大部分異步加載方式不支持async和await(c# 5 才推出的功能,老的異步加載內容不兼容)