上一页 1 ··· 4 5 6 7 8 9 10 11 12 下一页
摘要: 封装封装、继承和多态是面向对象“三大金刚”。这其中封装可谓三大金刚之首。封装(或称信息隐藏)亦即不对使用者公开类型的内部实现手段,只对外提供一些接口,使用者只能通过这些公开的接口与类型进行交谈。封装不好实际上继承和多态也是无稽之谈,即使不无稽也会风雨飘摇,使用者可能绕过你精心构造的对象层次,直接访问对象的数据,因为直接访问一切看起来那么自然而然,很简单,很直观也很容易,不需要经过大脑。面向对象面 向对象是一种将数据和行为绑定在一起的编程方法,虽然在面向过程的时代,也可以使用模块化设计将数据以及使用这些数据的行为绑定在一起,但是毕竟那是靠程 序员的个人自律。使用者还是可以轻松的无视这些约定,这样 阅读全文
posted @ 2012-10-23 11:35 怡馨 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 多少次有人问我如何构建一个比较好的类阶层次,如何使用面向对象进行设计,或者问为什么我看了那么多面向对象和设计模式的书一到使用的时候却总是写出面向过程的代码。每当我碰到这些问题的时候我总是回答,其实我也不知道。真的,其实我也不知道。虽然我总是张口闭口面向对象,总是看到一个问题后就谈这个有点XXX模式的影子,但大部分时候碰到一个问题我还是一片空白,不知道如何去分析设计和实现出好的面向对象。所以,我只想谈谈我是如何实践面向对象的,这对我自己有用但不一定对你有用。嗯,回到正题。回顾编程方法的发展史,我想不外乎两个字:抽象。从 最早的汇编语言中使用的子例程到结构化编程,然后到面向对象、面向组件以及面向服 阅读全文
posted @ 2012-10-23 11:33 怡馨 阅读(285) 评论(0) 推荐(0) 编辑
摘要: C#实现渐变颜色的Windows窗体控件!1,定义一个BaseFormGradient,继承于System.Windows.Forms.Form2,定义三个变量:privateColor_Color1=Color.Gainsboro;privateColor_Color2=Color.White;privatefloat_ColorAngle=0f;3,重载OnPaintBackground方法protectedoverridevoidOnPaintBackground(PaintEventArgspevent){//GettingthegraphicsobjectGraphicsg=peve 阅读全文
posted @ 2012-08-18 17:07 怡馨 阅读(3242) 评论(0) 推荐(0) 编辑
摘要: 对于C# 更改窗体外观感觉并不那么轻松 更改窗体外观涉及到使用GDI+ 我所知道的有两种方法:有系统边框的窗体 处理窗体的Paint方法,在paint方法中 参数e.Graphics属性将返回一个对象 用来作画 但是这个画布的区域是窗体的客户区 所以无法修改到窗体的标题栏 边框等位置的。要更改标题栏只有获取整个窗口的句柄 这样创建的画布是整个窗体区域 但是对于我这样的初学者来说 对于句柄 windowsAPI还很不熟悉 我相信大多数的初学者或者学生都和我有相同的困惑 所以我使用了第二种办法 无边框窗体无边框的窗体 把FormBorderStyle的属性设置为none 就去掉了边框 剩下的窗体客 阅读全文
posted @ 2012-08-18 16:13 怡馨 阅读(543) 评论(0) 推荐(0) 编辑
摘要: 建议3:区别对待强制转型与as和is 在阐述本建议之前,首先需要明确什么是强制转型,以及强制转型意味着什么。从语法结构上来看,类似下面的代码就是强制转型。secondType=(SecondType)firstType; 但是,强制转型可能意味着两件不同的事情: 1)FirstType和SecondType彼此依靠转换操作符来完成两个类型之间的转型。 2)FirstType是SecondType的基类。 类型之间如果存在强制转型,那么它们之间的关系,要么是第一种,要么是第二种,不能同时既是继承的关系,又提供了转型符。 首先看第一种情况,当FirstType和SecondType存在... 阅读全文
posted @ 2012-08-07 12:25 怡馨 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 一:Task的优势ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:1: ThreadPool不支持线程的取消、完成、失败通知等交互性操作;2: ThreadPool不支持线程执行的先后次序;以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的API。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。以下是一个简单的任务示例:staticvoid Main(string[] args) ... 阅读全文
posted @ 2012-08-07 11:45 怡馨 阅读(441) 评论(0) 推荐(0) 编辑
摘要: 在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作。Parallel主要提供了3个有用的方法:For、ForEach、Invoke。For方法,主要用于处理针对数组元素的并行操作,如下:staticvoid Main(string[] args){int[] nums =newint[] { 1, 2, 3, 4 };Parallel.For(0, nums.Length, (i) =>{Console.WriteLine("针对数组索引{0}对应的那个元素{1}的一些工作代码……",i, nums 阅读全文
posted @ 2012-08-07 11:45 怡馨 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 在C#中让线程同步的另一种编码方式就是使用线程锁。所谓线程锁,就是锁住一个资源,使得应用程序只能在此刻有一个线程访问该资源。可以用下面这句不是那么贴切的话来理解线程锁的作用:锁,就是让多线程变成单线程。在C#中,可以将被锁定的资源理解成new出来的普通对象。既然需要锁定的资源就是一个C#中的对象,我们就该仔细思考,到底什么样的对象能够成为一个锁对象(也叫同步对象)?在选择同步对象的时候,应当始终注意以下几点: q同步对象在需要同步的多个线程中是可见的、同一个对象; q非静态方法中,静态变量不应作为同步对象;q值类型对象不能作为同步对象;q避免将字符串作为同步对象。q降低同步对象的可见 阅读全文
posted @ 2012-08-07 11:42 怡馨 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 开发者总尝试对自己的代码有更多的控制。“让那个还在工作的线程马上停止下来”就是诸多要求中的一种。然而事与愿违,这里面至少存在两个问题:第一个问题是:正如线程不能立即启动一样,线程也并不能说停就停。无论采用何种方式通知工作线程需要停止,工作线程都会忙完手头最紧要的活,然后在它觉得合适的时候退出。以最传统的Thread.Abort方法为例,如果线程当前正在执行的是一段非托管代码,那么CLR就不会抛出ThreadAbortException,只有当代码继续回到CLR中时,才会引发ThreadAbortException。当然,即便是在CLR环境中,ThreadAbortException也不会立即引 阅读全文
posted @ 2012-08-07 11:41 怡馨 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定。C#中对象的类型分为引用类型和值类型。CLR在这两种类型上的等待是不一样的。我们可以简单的理解为在CLR中,值类型是不能被锁定的,也即:不能在一个值类型对象上执行等待。而在引用类型上的等待机制,则分为两类:锁定和信号同步。锁定,使用关键字lock和类型Monitor。两者没有实质区别,前者其实是后者的语法糖。这是最常用的同步技术;本建议我们讨论的是信号同步。信号同步机制中涉及的类型都继承自抽象类WaitHandle,这些类型有EventWaitHandle(类型化为AutoResetEvent、M 阅读全文
posted @ 2012-08-07 11:40 怡馨 阅读(199) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 下一页