读了Java重写方法与初始化的隐患这篇文章,带着对C#初始化的疑问,在C#里做了如下测试:
1 | public class BaseClass |
so,C#里面 子类static成员 -> 子类普通成员初始化和初始化块 ->父类static成员 -> 父类static成员 -> 父类普通成员初始化和初始化块 -> 父类构造方法 ->子类构造方法。
读了Java重写方法与初始化的隐患这篇文章,带着对C#初始化的疑问,在C#里做了如下测试:
1 | public class BaseClass |
so,C#里面 子类static成员 -> 子类普通成员初始化和初始化块 ->父类static成员 -> 父类static成员 -> 父类普通成员初始化和初始化块 -> 父类构造方法 ->子类构造方法。
遇到的问题:
1.git和svn的区别
2.webservice和wcf的区别
这两个问题促使我在对框架和工具的使用中必须要反思不能只知道使用而不知道去理解,
就像只会去学习使用编程语言而不知道去理解语言之间的异同和在开发项目时应该选择哪种语言更合适。
3.调试项目代码遇到的问题。
在开发过程中只保证进度而不思考和立即改进现有代码和设计导致在部署后很难通过简单的测试,而且不能立即定位问题所在。这会带来时间上的浪费。
归根于代码上的设计不够严谨 应该要把逻辑中可能出现的异常反馈到日志,从而对数据非预期展现的快速定位。
###
1.0源码:1
2
3
4
5
6
7
8
9
10
11//先获取UTF8静态属性
PropertyInfo property = typeof(Encoding).GetProperty("UTF8", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public);
//获取属性值
object objUTF8 = property.GetValue(null,null);
//获取GetString函数列表
IEnumerable<MethodInfo> infos = typeof(Encoding).GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Where(m => m.IsVirtual && m.Name == "GetString");
byte[] bys = new byte[] {};
//调用第一个GetString函数
object obj = infos.First().Invoke(objUTF8, new object[] { bys });
ShellDescritorManager有个UpdateShellDescriptor方法
1 | public void UpdateShellDescriptor(int priorSerialNumber, IEnumerable<ShellFeature> enabledFeatures, IEnumerable<ShellParameter> parameters) { |
看最后的_events.Changed 是调用了IShellDescriptorManagerEventHandler接口的Changed方法。
那为什么一个EventHandler会命名为_events呢?答案在EventsRegistrationSource类中
1 | public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) { |
在构造器中指定了拦截器 EventsInterceptor ,拦截器又传入了EventBus.
我们来看看拦截方法是怎样的:
1 | public void Intercept(IInvocation invocation) { |
调用了eventBus的Notify方法
1 | public IEnumerable Notify(string messageName, IDictionary<string, object> eventData) { |
其实就是调用了各个实现IEventHandler接口的类。