C#


巧用委托简化重复代码

在C#编程中通常会碰到许多重复劳动的情况,而面向对象编程的原则就是消除这些重复劳动,增加代码重用性。我们虽然有很多基本的模式去做抽象和封装,但还是会碰到一些看似不得已的重复劳动的情况。比如你在写一个数据访问层的类,按照规范,每个方法都需要加try-catch,就像这样: public void Method1() { try { // logic... } catch (DataException ex) { // fuck the ex... } } public void Method2() { try { // logic... } catch (DataException ex) { // …


C#创建Windows服务入门图解(VS2010)

Windows服务大家都知道,比如Audio、Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的。所以以前曾经用来隐藏过木马。但以前搞的那个木马服务,是通过手工导注册表来做的。从来没正式的开发过一个服务。 之前做的一个项目里有人用Service的方法定时获取远程数据,很犀利,我感觉还是挺有用的。所以今天我也开荒了一下用C#开发Windows服务,正规的体验了一下开发流程。下面就是我做的最入门的例子,MSDN上有类似的教程,但MSDN漏了一些比较重要的步骤,所以大家请看我开荒成功的版本: 首先,在VS2010里建立一个Windows Service项目: 它会提供我们一个默认的Serivce1,可以删掉,换成自己的。比如Fucker.cs,当然,你得把Program.cs里调用的语句换掉: static void Main() { …


Read Excel 2010 via C#

昨天一个同学让我帮忙写个小工具,读一个Excel,只读B列的内容。我拿C#写了一个.NET4的winform程序。虽然简单,但有很多可圈可点的地方,因此撰写本文以警后人。 那个Excel是2010格式的,所以我们先要安装AccessDatabaseEngine,下载地址如下: http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe 这样程序读取Excel的时候就不会抛出OleDb驱动未注册的异常了。 我们先看看Excel文件,格式很简单: 我们需要读的,是B列除标题以外的内容。即B2到B6的内容,观察到它是字符串,所以程序里要作为string读取。 程序界面设计如下,点击ReadExcel后,会将B列的内容显示到 …


C#将窗口最小化到系统托盘,并显示图标和快捷菜单

1. 拖一个notifyIcon和一个contextMenuStrip过来,他们会出现在窗体设计器的最下方: 然后完成你的menu,它暂时会出现在form上,但没关系,运行的时候不会显示。 2. 给notifyIcon设置icon属性,这一步很重要,不然系统托盘处不会有图标。然后将ContextMenuStrip属性设置为刚才的那个快捷菜单。 3. 现在运行程序的时候,任务栏右下角系统托盘处就会有我们的图标和菜单: 4. 现在我们来处理最小化隐藏和还原的问题: 首先要将form的ShowInTaskBar属性设为false,这样它就不会在任务栏中显示。但如果现在最小化,屏幕左下角仍然会有一条细小的标题栏。这里我们需要手工处理一下: 在form的resize事件里这样写: private void frmMain_Resize(object sender, …


C#数据结构之顺序栈

继续发很久以前的那个系列。。。今天是顺序栈。。 接口如下: public interface IStack<T> { void Clear(); void Push(T item); T Pop(); T GetTop(); } SqStack类: public class SqStack<T> : IStack<T> { private int _Maxsize; private T[] _Data; private int _Top; public T this[int index] { get { return _Data[index]; } …


几种常用的代码重构手法

最近看了Martin Fowler的著作《Refactoring: Improving the Design of Existing Code》收获颇大。书上的例子都是Java写的,其实我们同样可以运用在其他语言中,现在做.NET开发的话,用的最多的就是Visual Studio,它自带的重构功能可以很方便的整理代码。 重构的好处不多叙述了,大家都明白。书上论述的非常详细,我挑选几种最常用的重构方法,并用C#语言做示例,帮助大家了解必要的重构手法。另外,我也会附上一些自己平时在编程中常用的重构片段,但未必是100%正确或最好的。 1.Extract Method (提取函数) 样例代码: public void PrintOwing(double amount) { PrintBanner(); // print details Console.WriteLine(" …


C#数据结构之顺序表SqList

最近在公司On Bench比较蛋疼,正好手头有本《C#数据结构》,拿来复习一下数据结构。以前大学里都是用C语言写的,C#从来没试过,毕竟C#本身就带有很多数据结构的Class可以直接拿来用。出于实验性目的,我还是看着书用C#写了几个demo。书上有些错误我也一并修正了。接下来发的代码都是经过测试可以正常运行的~DAY1.顺序表最近博客系统有点BUG,代码中如果有三条杠注释就会排版混乱,所以抱歉这次不能带注释了。IListDs接口:public interface IListDs {     void Clear();     void Append(T item);     void Insert(T item, int i);     T Delete(int i);     T GetElement(int i);     int Locate(T value); } …


数组删除重复元素,List<T>实现

这是个很老很无趣的话题,常见于C语言的作业题。其实严格意义上来说,用List泛型属于作弊了~,但过程非常简单,没有技术含量,主要是让大家看看C#的优雅。我们知道,以前在C语言中要删除数组里的重复元素非常麻烦,要有两个游标(这意味着至少2层for嵌套),还要关心元素移位的问题。现在,如果把数组这样可以看作集合的东西放到集合类型里,比如List泛型,事情就会容易的多:static void Main(string[] args) {     List strs = new List() { "a", "b", "c", "c", "d", "c", "a", "e", "f", "b", "g", "h" };     // 不能用foreach,因为迭代器是只读的     for (int i = 0; i 有图有真相:


C#仿魔兽世界密保卡OOP重构版

昨天下午我把《C#仿魔兽世界密保卡简单实现》 中的代码用面向对象的方法重构了一遍,引入了2个类:MatrixCard和Cell。MatrixCard描述的是密保卡,构造函数中会随机生成一个二 维矩阵,所以每次new一个MatrixCard对象,就已经生成了一张密保卡。Cell是单元格的意思,将行号、列号、列名做了封装。 MatrixCard类中保留了之前的大部分静态方法,以便灵活调用。由于本人水平有限,这次的设计并不是非常完美,并且也有一些遗憾。比如现在只能通过Cell[i]的方式来访问单元格,而不可以像Cell["A0"]这样写。有空的时候哥去研究一下重载索引器,争取把它实现。下面发代码:MatrixCard类:using System; using System.Collections.Generic; namespace GeekStudio.Common {    …


C#仿魔兽世界密保卡简单实现

昨天拿C#写了个简单的密保卡程序(Console的,偷懒了一下 哈哈),实现了随机生成5x5矩阵卡、转换为字符串、从字符串读取矩阵卡以及简单验证的功能。不过我写的比较草率,代码结构不是很好,也没有体现OOP的思想,这几天有空会重构一下。先把代码发出来:public class MatrixCardManager      {          public static int[,] ReadMatrixCardFromString(string matrixStr)          {              int[,] arr1 = new int[5, 5];              int[] tempArr = new int[25];              int k = 0;              string[] tempArrStr =  …


C#获取进程、查找并结束进程

最近看到一个考试系统,有个功能是用来监视进程的。一旦发现如Communicator.exe这样的违禁软件就立即杀死进程并上报给服务器。我稍微研究了一下,这个功能实现起来其实很简单。就是使用ManagementObjectSearcher获取进程列表,然后放在一个Collection里,之后就可以按照自己的逻辑去做了。 下面是一个例子:获取进程列表、创建“违禁”进程名单、查找并杀死进程。注意先要在项目里添加System.Management的引用。using System; using System.Management; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { / …