2012年1月4日
摘要: 程序中往往涉及定位问题,定位有两种办法:1、起点+大小2、起点+终点二者本质上一样,C#中大多采用起点+大小的办法,比如C# String的方法 Substring(int startIndex, int length)Java中大多采用起点+终点的办法,比如Java String的方法 substring(intbeginIndex, intendIndex)其实 起点+大小 更为合适,大多数情况下,我们的使用场景是:知道起点和大小。比如,在WPF中Grid的用法。View Code 1 <Grid> 2 <Grid.RowDefinitions> ... 阅读全文
posted @ 2012-01-04 17:26 Andy Niu 阅读(287) 评论(0) 推荐(0)
  2011年12月31日
摘要: 异常可以认为是:成员没有完成,他声称可以完成的任务。成员没有完成他声称可以完成的任务,并不一定是该成员自身的原因,也有可能是其他的原因导致的。比如:该成员调用的其他成员有问题,或者给该成员的数据输入有问题,导致该成员不能完成任务。异常处理方式就是try{}catch{]finally{},try{}包含可能出现问题的代码,catch{} 对可能出现的问题进行捕捉,finally{} 不管有没有问题最后都要执行。一个try{}对应多个catch{},catch{}的设计理念是,找到第一个匹配的,而不是找到一个最匹配的。因此,当找到第一个匹配的时候,将跳过后面所有的catch{}。根据这个特点,c 阅读全文
posted @ 2011-12-31 17:04 Andy Niu 阅读(517) 评论(0) 推荐(0)
摘要: 根据C语言的说法,局部变量:定义在方法内部的变量叫局部变量;全局变量:定义在方法外部的变量叫全局变量。局部变量和全局变量的主要区别在于二者的生存周期不同。全局变量的生存周期:静态分配内存,程序运行期间常驻内存,直到程序运行结束。局部变量的生存周期:动态分配内存,位于线程堆栈中。另外全局变量和局部变量的作用域不同,举例来说,类中的变量作用域在当前类中,类方法中的变量作用域在当前方法中。全局变量的使用场景:多个地方需要使用,大家共享。局部变量的使用场景:只在当前这个地方使用。在项目开发中,尽量少使用全局变量(准确地说,应该是尽量缩小变量的作用域)。为什么尽量少使用全局变量?首先,不符合高内聚、低耦 阅读全文
posted @ 2011-12-31 16:24 Andy Niu 阅读(1576) 评论(0) 推荐(0)
摘要: 1、首先,遍历集合不能采用foreach的方式,因为foreach in 不能在原集合中添加和删除元素。至于为什么,涉及到foreach的实现原理。2、只能使用for 遍历,删除满足条件的元素。需要注意的是,在使用for 遍历过程中,删除一个元素,集合发生两处变化:集合的大小减1;右边的元素整体向左移动一位。为了不漏掉元素,当前遍历位置应该向左后退一步。3、采用笨办法,先把集合的元素copy一份,使用foreach遍历copy集合,从原集合中删除元素。foreach是个语法糖,使用foreach遍历的集合,实现了IEnumerable 接口,该接口中有个方法GetIEnumerator,返回I 阅读全文
posted @ 2011-12-31 15:12 Andy Niu 阅读(1803) 评论(0) 推荐(0)
  2011年12月29日
摘要: readonly代表着只读,const代表着不变, 在讲readonly 与const的区别之前,先讲只读与不变的区别。只读说明不能写,但并不意味着不变,不变代表着常数,永远不会变化,好像是废话。举例来说,一个人的真实出生日期是不变的。当这个人注册邮箱,填写个人的信息时,年龄一项是只读的,系统会根据该人的出生日期自动计算出年龄,不允许用户修改年龄。但这并不意味着年龄不会变化,去年25岁,今年肯定要显示26岁。readonly的使用场景:只能修饰field,编译期知道字段是只读的,不允许再次赋值。但field的值有可能在运行期才确定下来,比如下面的代码:private readonly Date 阅读全文
posted @ 2011-12-29 20:14 Andy Niu 阅读(331) 评论(0) 推荐(0)
摘要: 先进行细分:类的成员分为:字段、属性、方法、构造方法成员的修饰符:静态成员、实例成员层次结构:父类、子类先不考虑继承关系,执行顺序为:静态字段静态构造方法实例字段实例构造方法属性和方法是在调用的时候才执行,这里就不考虑了。如何理解上面的执行过程?假如让我来设计执行过程,我该如何考虑,依据是什么?首先,静态的东西是大家共享的,也就是相同的。应该先关心共享的东西,再关系个人的东西。“先公后私”,呵呵。其次,实例化之前,应该先初始化自己的内部数据。现在考虑继承关系,执行顺序为:子类的静态字段子类的静态构造方法子类的实例字段父类的静态字段父类的静态构造方法父类的实例字段父类的实例构造方法子类的实例构造 阅读全文
posted @ 2011-12-29 16:59 Andy Niu 阅读(8734) 评论(6) 推荐(8)
摘要: 先举典型的例子,单例模式。View Code 1 public sealed class Singleton 2 { 3 private Singleton(){} 4 private static Singleton instance = null; 5 private static object syncRoot = new object(); 6 7 public static Singleton Instance 8 { 9 get10 {11 ... 阅读全文
posted @ 2011-12-29 15:23 Andy Niu 阅读(6893) 评论(2) 推荐(1)
摘要: 自己从Java 转向C#,习惯了Java中的Property +set/get 方法。在C#中,采用private field + public Property,当然在C#3.5 的新特性中,已经增加了Automatically Implemented Property,不用再写private field。仔细想想,C#的做法更符合编程思维。为什么?首先,属性是对象本身具有的,访问对象的属性应该是访问者的动作,而不应该是对象的动作。其次,方法代表着“可以做什么事”,访问属性不应该采用方法。 阅读全文
posted @ 2011-12-29 14:09 Andy Niu 阅读(2431) 评论(0) 推荐(0)
摘要: volatile的使用场景:多个线程同时访问一个变量,CLR为了效率,允许每个线程进行本地缓存,这就导致了变量的不一致性。volatile就是为了解决这个问题,volatile修饰的变量,不允许线程进行本地缓存,每个线程的读写都是直接操作在共享内存上,这就保证了变量始终具有一致性。缺点很明显:牺牲了效率。lock的使用场景:多个线程同时访问一个代码块,使用lock 修饰该代码块,强制多个线程进行排队,一个接一个的去访问。缺点很明显:排队进行必然导致效率低。系统中应该尽量减少lock的使用(也就是排队执行的情况),因为根据阿姆达尔定律:S=1/(a+(1-a)/n) ,其中S 为加速比,a 为串 阅读全文
posted @ 2011-12-29 12:07 Andy Niu 阅读(2599) 评论(2) 推荐(1)
摘要: UIElement 的DesiredSize 和 RenderSize的区别如下:DesiredSize:元素在布局过程中,根据相关属性测量处理的大小,是只读的。RenderSize:元素在布局完成后,最终Render的大小,是可以读写的。 阅读全文
posted @ 2011-12-29 11:35 Andy Niu 阅读(1571) 评论(0) 推荐(0)