现在的位置: 首页 > 综合 > 正文

C#/WPF 程序设计心得(一)

2017年10月01日 ⁄ 综合 ⁄ 共 3182字 ⁄ 字号 评论关闭
 

1、尽量避免装箱(将值类型value type转换为引用类型reference type)拆箱带来的性能损耗(数据不停的搬迁于堆区和栈区)。

2、wpf的资源使用可通过:应用程序级资源(App.xaml)、窗体级资源(Window/Page)、文件级资源(资源字典)、对象级资源(控件)。使用级别由里到外。有静态(StaticResource)和动态(DynamicResource)引用之分,静态从其容器开始向上查找(编译时),动态从当前开始查找(运行时)。

3、程序设计开始时请使用Canvas、Grid、StackPanel、DockPanel、WrapPanel或自定义面板布局程序界面。

4、.net(c#)的根类库object及诸多类库均架构于不同的名字空间里,故使用类中函数时候需要应用不同名称空间。C#没有多重继承的概念,但是可以通过接口的多重继承实现,interface实质上就是一个虚函数列表指针,interface不可能实例化而只能通过派生才可以使用。

5、C#的所有类型都被封装成类,包括基本数据类型,这是分装性和面向对象的体现。

6、值类型和引用类型的本质区别是引用下面不是具体数值而是一段内存的地址。C#的引用类型有:string、类、数组、委托、接口。C#对用户隐藏了指针的使用,但其引用、ref、out等以指针具有相似的道理。

7、委托说到底就是为了方便函数调用(通常是异步过程)的函数指针。

8、只要设置了某个对象的DataContext,那么对这个对象的所有子对象都会产生同样的影响。

9、进程是线程的载体,线程是进程的主角。线程间存在同步异步过程,线程同步需要考虑对临界资源的控制与锁定,线程同步的相互协调不是靠线程优先级来控制的,而是使用lock和monitor. lock保证了共享资源的安全和线程执行顺序的合理.针对实例方法构造的线程,于线程函数内使用lock(this){}锁定互斥段代码。针对静态方法构造的线程,于线程函数(静态函数)内使用lock(typeof (class)){}锁定静态资源。

10、如果希望于线程中锁定某一个对象,请使用monitor. 形如: Monitor.Enter(object)........Monitor.Exit(object)期间,别的线程是无法访问该对象的。为了保证对对象的最终释放,请使用try-catch-finally.于finally 中Monitor.Exit(object).

11、请尽量使用委托来降低类与类之间的耦合度,其实委托不单单只是c 或c++中的函数指针,c#的委托更可以实现"多播委托"(+=/-=).

12、从Windows消息传递机制的包装,其具体体现就是在任意事件触发事件后事件调用时候传给事件处理函数的两个参数:Object sender,EventArgs e 。

13、win form 或者wpf 中的组件基本事件已经被.net frame work规定并准备好了,无需我们自己定义这些事件。如 button 的click事件,事件基于委托是不变的,如click事件其实基于public delegate void EventHandler(Object sender,EventArgs e).我们所需要做只是给该事件注册处理函数click += new EventHandler(callbackFunc);然后实现该回调函数。应该记得说过委托(事件机制)很好的处理了类间的耦合与通信。

14、事件应该定义在事件产生的主体里边,事件的触发由主体的实例完成,事件基于委托,委托定义基于事件处理函数,事件通常使用两个参数:Object Sender Sender通常代表着事件主体的实例(this),EventArgs e 通常是全局定义的一个类型。第一个参数用来给事件处理函数传递主体实例以便使用实例中的元素,第二个参数给事件处理函数传递一些辅助信息。

15、多态是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。

16、继承父类后重写了父类函数(可省略new修饰符)可将父类函数"隐藏"(Hide),"隐藏"不同于"覆盖/重写"(Override),隐藏是只父类的这个函数还是存在,只是被子类的同名函数"藏起来了"。

17、多态性是于封装性、继承性后OO技术的进一步表现。C#中多态必须有:继承、virtual、override。virtaul标示了函数的"名存实亡"程序执行时可依此尝试发现有没有override链(虚表)的存在,如果存在就调用override链上的最新可用版本。

18、“多”表示在实例化引用变量的时候,根据用户当时的使用情况而不是一来就实例化很多个引用变量(这时候程序已经Release了,不能再修改了,程序员已经不能控制程序了)智能地给出个性化的响应。

19、 多态最大的实现意义在于"代码的简化和良好的扩展性",作为OO技术的一大表现,多态为我们竖起了标杆,使用标杆,程序可以根据用户的实际需要动态绑定相关对象并启用服务,此时,代码是程序员不可控的。如此一来,不论在代码的简洁编写还是扩展升级的改动工作都是极大方便的。可考虑按钮等的事件响应函数button1_clicked(object sender,EventArgs e) 其object即是万类之源,其声明的诸多函数都是virtual函数,函数调用时候sender对应实际的子类对象并依据虚表动态定位到子类对象相关的函数,如.Tostring();

20、如果使用的是基接口而不是基类,那么实现基接口的时候,方法不再需要override关键字。

21、程序集的中间语言,主要是元数据结合反射即可实现vs的object browser和自动代码提示功能。一个程序集能够使用元数据来完整地说明说明自己而不用像c/c++那样使用头文件,称之:自包含性 自描述性。

22、Attribute不是什么“修饰符”,而是一种实例化方式比较特殊的类。

23、不使用new操作符来产生实例,而是使用在方括号里调用构造函数的来产生实例。方括号必需紧挨着放置在被附着目标的前面。

24、Attribute是特性,Property是属性,姑且从名字上这样分开。Attribute是类,在编译的时候被实例化,Attribute的目标是:为元素提供附加信息,他的作用更类似于注释。Property是一个面向对象的概念,提供了对私有字段的访问封装,以get和set访问器方法实现对可读写属性的操作,提供了安全和灵活的数据访问封装。

25、接口就是一套类的“行为规范”,一般是架构师设计出来用于约束程序员以保障团队顺利分工协作的手段,它处于抽象的最顶层,可以多重继承,成员都是纯虚的。

26、WPF UI层与逻辑层要尽可能地剥离(解耦)。

27、WPF UI层与逻辑层的“血管”是数据关联(Data Binding)。

28、数据关联的核心思想是:数据决定UI。UI的作用是Update数据。

29、XAML中标签的元素Name的作用是告诉解析器其对应着一个引用变量,变量名使用Name的值,对应实例的Name属性也使用Name的值。

30、继承自FrameworkElement的诸多控件实例的Name属性具备了作为查找标识的资格。

31、x:Name与Name根本不是一个层面上的东西——Name是直接与元素和面向对象编程相关的东西;x:Name是XAML语言解析层面上的东西。

32、wpf中:x=""通常是命名空间的别名。x: 通常是命名空间下的元素。

33、用C#代码编写的类也可以在XAML文档里声明实例,声明之后我们可以使用XAML的Attribute对实例的 Property进行赋值。为了类型转换我们继承TypeConverter重写ConvertFrom().

抱歉!评论已关闭.