Dot Net FrameWork 4.0 學習筆記(4)
終於能夠有一天上午沒有工做,但公司在這周不給調休的機會,哎,那就利用這些時間來繼續寫點學習筆記吧... 
1.Named And Optional Arguments - 命名參數和可選參數
2.Dynamic Binding - 動態綁定 (dynamic 用於動態編程,其依賴於 Dynamic Language Runtime)
3.Covariance - 泛型的協變
Contravariance - 泛型的逆變
4.CountdownEvent - 線程、任務同步類。線程或任務一直阻塞到 CountdownEvent 的計數爲 0 爲止
Barrier - 線程、任務同步類。其用來同步一個線程組或任務組中全部的線程或任務,先到達的線程或任務在此阻塞
1, 命名參數和可選參數
static void Main(string[] args)
{
Write(1);
Write(1, "zhangsan");
Write(1, arg3: false, arg2: "webabcd");
}
static void Write(int arg1, string arg2 = "p2", bool arg3 = true)
{
Console.WriteLine(string.Format("p1:{0}; p2:{1}; p3:{2}", arg1, arg2, arg3.ToString()));
}
2, 動態綁定
public class DyanmicDemo
{
public string Hello(string name)
{
return "hello: " + name;
}
public string Name { get; set; }
public string this[string value]
{
get
{
return value;
}
}
public dynamic GetNames()
{
List<string> names = new List<string>() { "zhangsan", "wangwu", "zhaoliu" };
return names;
}
}
public partial class DynamicBinding : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
dynamic d = new DyanmicDemo();
Response.Write(d.Hello("method"));
d.Name = "hello: property";
Response.Write(d.Name);
Response.Write(d["hello: indexer"]);
Response.Write(d.GetNames().Count.ToString());
// 注意:下面這句會報錯,由於不支持擴展方法
// Response.Write(d.GetNames().Last());
}
}
/*
運行結果:
hello: method
hello: property
hello: indexer
3
*/
其上呢就是動態類型爲咱們提供的綁定對象機制了,固然動態類型也能夠作數據綁定等操做,也能夠用於多種開發模式之上,詳見msdn啦
3,泛型協變 (固然普通的類中這些操做都是被容許的)
public class People
{
// 某某屬性
}
public class Student : People
{
// 某某屬性
}
static void Main(string[] args)
{
List<People> list = peopleList.Union(studentList).ToList(); // 協變
List<People> list2 = studentList.ToList<People>(); // 協變
}
/*
運行結果:
固然他們的相同屬性值應該被合併或轉型
*/
// 協變簡單來講就是將子類泛型轉換成父類泛型的過程,究其緣由是由於List<T> 實現了以下接口 IEnumerable<out T> ,因此能夠實現協變,固然逆變的話,咱們也須要讓轉換類實現這個過程,固然ms並無提供相似方案,那麼咱們就須要自定義轉換類型 IOutput<in T>
interface IOutput<in T>
{
void Write(T o);
}
class Output<T> : IOutput<T> where T : People // 轉換類型限制
{
public void Write(T o)
{
Console.WriteLine(o.GetType().ToString());
}
}
IOutput<People> peopleList = new Output<People>();
IOutput<Student> studentList = peopleList;
// 由於student是people的子類,因此這也是實現逆變的條件
4,線程、任務同步類
CountdownEvent
using (var countdown = new CountdownEvent(1))
{
// 啓動工做項,增長1個計數,還須要將CountdownEvent的對象註冊到工做方法中去
Thread t1 = new Thread(() => ThreadWork("zhangsan", TimeSpan.FromSeconds(0), countdown));
countdown.AddCount();
// 當全部的工做項都已經同步完畢,減小1個計數
countdown.Signal();
// 阻塞當前線程,直到 CountdownEvent 的計數爲零
countdown.Wait();
}
ps:你們看到CountdownEvent可能會以爲疑問,CountdownEvent的使用會和Interlocked會很像,要注意的是
CountdownEvent用於並行運算處理工做項線程同步問題,而Interlocked則用於異步請求的原子操做,雖然
都是將變量進行加減,但意義不一樣 /微笑
Barrier
// Barrier(int participantCount) - 實例化一個 Barrier
// int participantCount - 須要阻塞的相關線程或任務數
Barrier barrier = new Barrier(2);
// 在回調函數或託管方法中,利用barrier可完成工做項線程的同步.barrier不須要爲工做項線程註冊.
// 當指定數量的線程或任務完成後,同步這些線程或任務
barrier.SignalAndWait();
ps: 此方法類與Monitor,MarshalByRefObject,Mutex等同步類或基類使用方法相似,但Barrier用於並行環境之下
以上就是第四節的所有內容
下節咱們將說說並行計算與任務管理,還有linq中的並行運算PLINQ
ps:這一節也是創建在咱們的硬件產品步步飛昇的基礎之上,
並行計算也絕對下一個須要密切關注的方向,
它能充分利用現有硬件資源將性能最大化,固然贏得的利潤也會呈增數級甚至幾何數級增加,很期待...
歡迎關注本站公眾號,獲取更多信息