终于可以有一天上午没有工作,但公司在这周不给调休的机会,哎,那就利用这些时间来继续写点学习笔记吧...
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:这一节也是建立在我们的硬件产品步步飞升的基础之上,并行计算也绝对下一个需要密切关注的方向,
它能充分利用现有硬件资源将性能最大化,当然赢得的利润也会呈增数级甚至几何数级增长,很期待...