随笔分类 - .NET基础
摘要:迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种。 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些。把这些迭代动作封装到一个接口中。 public interface IIterator { void First(); string Next(); bool I...
阅读全文
摘要:假设有一个软件公司,每当有新产品推出,就把信息通知到一些客户。 把通知这个动作抽象成一个接口。 public interface IService { void Notif(); }客户如果想获得通知,就需要实现以上的接口。这里的客户被看作是观察者。 public class CustomerA : IService { p...
阅读全文
摘要:当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式。 □ 即时加载的单例模式 把类的实例赋值给类的一个静态字段。 class Program { static void Main(string[] args) { Logger log = Logger.GetInstance(); log....
阅读全文
摘要:所谓的"对象为Null模式",就是要求开发者考虑对象为Null的情况,并设计出在这种情况下的应对方法。 拿"用最简单的例子理解策略模式(Strategy Pattern) "中的例子来说,在我们的客户端程序中只考虑了用户输入1,2,3的情况,如果用户输入其它数字,比如4,就没有一个对应的IBall接口实现类实例产生,于是会报如下的错: 为了应对这种情况,我们专门设计一个类,当用户输入1,2,3...
阅读全文
摘要:当一个动作有多种实现方法,在实际使用时,需要根据不同情况选择某个方法执行动作,就可以考虑使用策略模式。 把动作抽象成接口,比如把玩球抽象成接口。 public interface IBall { void Play(); }有可能是玩足球、篮球、排球等,把这些球类抽象成实现接口的类。 public class Football : IBall { ...
阅读全文
摘要:"延迟加载"是指在需要的时候再加载数据。比如获得一个Customer信息,并不会把该Customer的Orders信息一下加载出来,当需要显示Orders的时候再加载。简单来说,就是按需加载。使用"延迟加载"的好处是减少应用程序响应时间,降低内存消耗,避免不必要的数据库交互。 □ 即时加载 创建Order类和Customer类,Customer中维护着Order的一个集合,在Customer的构...
阅读全文
摘要:从.NET 3.0开始,在方法内部可以使用var关键字声明局部变量。var关键字到底是什么?在何种情况下使用呢? □ var关键字用来隐式地声明一个数据类型,变量类型是在编译期确定的,而不是在运行时确定的 声明一个var变量a,把整型数10赋值给a,接着把一个字符串赋值给变量a。运行发现报错:无法将类型string隐式转换为int。 这说明:用var声明一个变量时,虽然不是显式声明,但在编译...
阅读全文
摘要:当谈到垃圾回收,在C#中,托管资源的垃圾回收是通过CLR的Garbage Collection来实现的,Garbage Collection会调用堆栈上对象的析构函数完成对象的释放工作;而对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收。那么什么时候使用Idisposable接口,以及如何使用呢? public interface IDisposabl...
阅读全文
摘要:CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境。CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集,所以不能使用IL DASM进行查看,但CLR以dll的形式位于.NET版本号文件夹内。 □ C#源代码从编译到CLR运行的全过程 →编写C#源代码,以class,struct,enum,interf...
阅读全文
摘要:C#中子类是如何调用父类的?带着这个问题,体验如下: □ 通过子类无参构造函数创建子类实例 创建父类Person和子类Student。 public class Person { public Person() { Console.WriteLine("我是人"); } } public class Stude...
阅读全文
摘要:在System.Speech命名空间下,SpeechSynthesizer类可以把文字读出来,一起来玩下~~ 首先在Windows窗体项目中引入System.Speech。界面部分: 后台代码也很简单,只不过调用了SpeechSynthesizer类的一些方法:using System.Windows.Forms;using System.Speech;using System.Speech....
阅读全文
摘要:在用户权限系统中,有时候需要根据用户的签约时间和签约时长来判断是否到期。先帮助类: public static class DateExprieHelper { /// /// 根据签约时间和签约时长来判断是否到期 /// /// 签约时间 /// 签约时长 /// public s...
阅读全文
摘要:位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,> 右移 Right Shift,等等。本篇体验位运算符在C#中的应用。主要包括: ○ 进制转换 ※ 十进制转换成二进制 ※ 二进制转换成十进制○ | 按位或操作符○ & 按位与操作符○ ^ 按位异或操作符 ※ 使用^按位异或交换2个数 ※ 使用^按位异或进行加密运算○ ~ 取反操作符○ x > n 右移...
阅读全文
摘要:“世界上不会有两片完全相同的树叶”,这句话适用于现实世界。而在软件世界中,这句话变成了"世界上必须有两片完全相同的树叶",否则,很多事情无以为继。 当比较2个对象是否相等时,通常情况下:==操作符用来比较值类型,比较的是值;实例方法Equals和静态方法Object.ReferenceEquals比较引用类型,比较的是对象的地址。 在实际项目中,当比较2个引用类型对象时,我们的需求变为:通过依...
阅读全文
摘要:本篇用C#实现ATM自动取款机的一些功能。面临的第一个问题是:如何把与自动取款机相关的有形的、无形的方面抽象出来。大致如下: (1)关于用户帐号的类:Account(2)关于银行数据库的类:BankDatabase(3)关于ATM屏幕显示的类:Screen(4)关于ATM键盘的类:Keypad(5)关于进钞、出钞口的类:DepositSlot(6)关于ATM出钱的类:CashDispendser...
阅读全文
摘要:如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const ● const默认是静态的,可以通过"类名.字段名"来访问。● const变量只能在声明的时候赋值,不能在构造函数中为const类型变量赋值。● 一旦程序集被编译,const变量会被写进程序集的IL代码中。如果想修改c...
阅读全文
摘要:增量运算符++属于一元运算符,增量运算符可以出现在变量的前面作为前缀,也可以出现在变量的后面作为后缀。两者有何区别呢? 前缀方式加1先使用前缀方式加1,并把前缀方式加1后变量的值赋值给另外一个临时变量temp。 static void Main(string[] args) { int num1 = 0; while ...
阅读全文
摘要:我们知道,抽象类是不能被实例化的。但抽象类是否可以有构造函数?答案是可以有。抽象类的构造函数用来初始化抽象类的一些字段,而这一切都在抽象类的派生类实例化之前发生。不仅如此,抽线类的构造函数还有一种巧妙应用:就是在其内部实现子类必须执行的代码。 以下就是在抽象类的构造函数中来初始化字段。 class Program { static void Main(string[] ...
阅读全文
摘要:假设有2个类,一个类是主力球员,一个类是替补球员。 public class NormalPlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public de...
阅读全文
摘要:int类型的最大值是2147483647,2个最大值相加就会超出int的最大值,即出现溢出。 class Program { static void Main(string[] args) { int y = 2147483647; int x = 2147483647; int z = x...
阅读全文
浙公网安备 33010602011771号