終于可以有一天上午沒有工作,但公司在這周不給調休的機會,哎,那就利用這些時間來繼續寫點學習筆記吧...
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:這一節也是建立在我們的硬體産品步步飛升的基礎之上,并行計算也絕對下一個需要密切關注的方向,
它能充分利用現有硬體資源将性能最大化,當然赢得的利潤也會呈增數級甚至幾何數級增長,很期待...