[DeveloperInfo("John", "2018-06-23", Describe = "this is a test class.")] publicclassBusiness { [DeveloperInfo("John", "2018-06-23", Describe = "this is a test property.")] publicint TestProperty { get; set; } [DeveloperInfo("John", "2018-06-23", Describe = "this is a test method.")] publicvoidTestMethod() { } }
I/O ( Input/ Output )线程主要用于与外部系统交互信息,如输入输出, CPU 仅需在任务开始的时候,将任务的参数传递给设备,然后启动硬件设备即可。等任务完成的时候, CPU 收到一个通知,一般来说是一个硬件的中断信号,此时 CPU 继续后继的处理工作。在处理过程中, CPU 是不必完全参与处理过程的,如果正在运行的线程不交出 CPU 的控制权,那么线程也只能处于等待状态,即使操作系统将当前的 CPU 调度给其他线程,此时线程所占用的空间还是被占用,而并没有 CPU 处理这个线程,可能出现线程资源浪费的问题。如果这是一个网络服务程序,每一个网络连接都使用一个线程管理,可能出现大量线程都在等待网络通信,随着网络连接的不断增加,处于等待状态的线程将会很消耗尽所有的内存资源。可以考虑使用线程池解决这个问题。
当派生类与基类型相同的方法使用 new 修饰时,派生类对象转换后,调用的是基类的方法。其实可以理解为,使用 new 关键字后,使得派生类中的方法和基类中的方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。所以,基类中的方法不管用还是不用 virtual 修饰,也不管访问权限如何,或者是没有,都不会对派生类的方法产生什么影响(只是因为使用了 new 关键字,如果派生类没用 new 关键字从基类继承同名方法,编译器会输出警告)。这可能是设计者有意这么设计的,因为有时候我们就是要达到这种效果。严格的说,不能说通过使用 new 来实现多态,只能说在某些特定的时候碰巧实现了多态的效果。
{ Console.WriteLine("**************** 匿名类型与var ****************"); var user = new { Id = 1, Name = "Kangkang", Age = 12 }; //user.Name = "Xiaoming";//匿名类型属性只读 Type type = user.GetType(); var properties = type.GetProperties(); foreach (var item in properties) { //只读属性反射也无法修改属性值 //if (item.Name == "Name") //{ // item.SetValue(user, "Xiaoming", null); //} Console.WriteLine($"Property name is {item.Name}, value is {item.GetValue(user, null)}."); } }
扩展方法
定义
静态类里的静态方法,第一个参数类型前加this关键字
1 2 3 4 5 6 7 8 9 10
publicstaticclassExtensionClass { publicstatic Human CheckHuman(this Human human) { human = human ?? new Human("Kangkang","China"); human.Name = string.IsNullOrEmpty(human.Name) ? "EmptyName" : human.Name; human.Country = string.IsNullOrEmpty(human.Country) ? "China" : human.Country; return human; } }
如上,在不修改类型封装的前提下,给类型额外的扩展一个方法(密封类也可以),扩展的方法为实例方法。
使用
既然为实例方法,我们便可以像实例方法一样调用:
1 2 3 4 5
{ Console.WriteLine("**************** 扩展方法的使用 ****************"); Human human = null; human.CheckHuman().SayHi(); }
// 可以理解其为一个特殊的字典 我们可以使用字典的方式遍历 foreach (var item in para as IDictionary<string, object>) { Console.WriteLine($"{item.Key}{item.Value}"); }
// 调用不存在的“属性”编译时不会报错 但是运行时会报错 // Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“'System.Dynamic.ExpandoObject' does not contain a definition for 'hobby'” Console.WriteLine(para.hobby);