由于近期很长一段时间没有开发任务,最近都是在看书学习,不免有些茫然,然后在微博上问了问李天平老师,如何稳步提高自己的技术?

李老师答复:

1.继续保持看书学习,这是一种习惯。(需要继续坚持,汤姆大叔建议说每个月要读一本书)

2. 找一些感兴趣的优秀代码研究一下,学习别人的开发思想,比看书更有效。 (谁能推荐一些优秀代码呢)

3. 试着给自己做一个感兴趣的软件功能或者小程序,兴趣是学习的源动力。

4. 参与相关技术社区的讨论,看看大家都在讨论什么,帮助他人就是帮助自己。

posted @ 2012-01-07 14:27 段英杰 阅读(47) 评论(0) 编辑

佛说:欠下的债,早晚会还的。哎,大学没好好学数据结构,现在恶补吧。还债啦!!!

 

时间复杂度用O()来体现,我们称之为大O记法。记做:T(n)=O(f(n))

一般情况下随着n的增大,Tn)增长最慢的算法为最优算法。

O1)叫常数阶 On)叫线性阶 On2)叫平方阶

 

推倒大O

1.       用常数1取代运行时间中的所有加法常数

2.       在修改后的运行次数函数中,只保留最高阶项。

3.       如果最高阶项存在且不是1,则去除与这个项相乘的常数。

得到的结果就是大O阶。

 

对于高斯算法而言,这个算法的运行次数函数是f(n)=3,根据我们推导大O阶的方法,第一步就是把常数项3改为1。在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的时间复杂度为O(1)

 

对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变大而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O1)。

 

线性阶:

Int I;

For(i=0;i<n;i++)

{

 

}

因为循环体中的代码要执行N次,所以它的循环的时间复杂度为O(n)

 

对数阶:

Int count=1;

While (count<n)

{

   Count=count*2;

}

由于每次count乘以2以后,就距离n更近了一分。也就是,有多少个2相乘以后大于n,则会退出循环。由 2x=n 得到x=log2n。所以这个循环的时间复杂度为O(logn)

 

 

最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

 

 

算法空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记做:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。

常见的时间复杂度所耗时间的大小排列

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)

 

posted @ 2011-11-17 11:54 段英杰 阅读(75) 评论(0) 编辑
再过几天,我就正式告别程序员生涯了,这也是我最后一次以职业程序员身份在CSDN发表文章。
小弟谈谈入行几年来的感受,做一个人生阶段的自我总结,同时希望能给后来者带来点参考意见,能在这段路上走的更好。

本人2002年下半年正式入行,至今2007年4月一直从事软件开发工作。
上大学选择这个专业是阴差阳错,但接触之后对计算机产生了强烈的兴趣,对写软件有一种强烈的冲动。
软件成型后,那种成就感和自豪感能给我难以名状的满足。
那时,喜欢看侯捷的书,对核心技术和核心技术人员由衷的崇拜,对技术的追求和水平的提高有一种莫名的狂热,当时我想只要能从事软件开发的工作,起初的薪金待遇可以不计,等我技术方面成熟后,自己就有更高更好的选择了,程序员-系统分析-项目经理-自己的软件公司,这是当时我一个朦胧的程序人生规划。
现在想来,不禁一番唏嘘。

我记得我在培训的时候,一个培训的老师当时是本地一家有名的高科技企业的CTO,确实是专业人才,就是不太会讲课。我问他做程序员的感受,他说经常写程序经常写到凌晨2点钟,很累不过很有意思,因为他喜欢这份职业(当然喜欢啊,他月薪7000-8000,2001年,济南),但也干不长啊,他已经做好了转行的准备,去做和计算机相关的行业。那年他28岁,我22岁。其实他那番话让我和我的同学已经很羡慕,我们羡慕他的技术深度和现在的岗位层次,金领啊,他就是我们眼里的金领啊。
而另一个技术水平很高的老师(在外企写单片机的,30岁,月薪8000-1万),告诉我的是:迟早要转行,就像他现在来当培训教师一样,原因:太累。


我没在乎他们的感慨,因为我年轻啊,加班到夜里2点很轻松啊,何况写写自己喜欢的软件,很高兴啊。30岁那时对我来说只是一个遥远的数字。工作后,感觉完全不一样了。首先很惭愧自己的机遇和能力都不是太好,一直从事基于数据库的信息管理系统的开发(我认为是软件开发里最简单和最基础的方面),换了三家公司,从基础程序员作到了系统分析的层次,现在开始往对外和管理方面发展。可以说粗略的沿着我以前设计的程序人生轨迹走了走。
其间也有过失业的落魄,吃不上饭的紧张,我记的最难的时候到CSDN上来发表文章,得到了很多兄弟姐妹的祝福和支持,给了我很大的鼓励,真的谢谢。
(鄙视自己一下:当时李开复很火,自己给他写过信,希望得到启发和帮助。现在才知道他是个什么样的人品,真惭愧,媒体说的话有时真不能信。)


我今年28岁,未婚,彻底烦了。为什么?累;没有希望。先说说我的一点感悟。
软件行业分析:
1、开发出售行业适用的单机版软件。
2、开发行业适用的网络版(B/S)软件,一般是大单,几十万到几百万。
3、和行业的政府主管部门合作,推行一些行业方面的应用软件。
补充:做软件一定要做行业软件,才有前途。

这是本人几年来对这个行业的一点分析。

其实第一种情况是软件公司最通常的盈利模式,这种模式软件价格不高,但只要质量站得住脚,可以细水长流,保证公司的成本没问题,做的好还可以盈利不少,但想做大公司很难。

第二种情况,是真正挣钱的情况,接一个大单,什么钱都挣出来了。可以锻炼开发队伍,建立完整的大的开发框架,而且在这个行业里可以造成很大影响,在一个地方实施成功后可以低成本的再推广,占领一片市场。总之一句话可以让一个小公司真正的成长起来。

第三种情况纯粹就是敛财了,和主管部门合作,强行推广软件,绝对的只赚不赔,我想各个地区都有这样的案例,如税务方面的。缺点是这样的公司都受地域性限制,老板钱拿的太舒服,没什么上进心,公司很难做大,不过也成了地方的行业一霸了,也不错。


累,大家都知道就不说了。为什么没有希望呢?因为我发现一个公司真正勤勤恳垦的实干是挣不到大钱的。
真正能挣到大钱的公司完全都是靠老板的个人关系到什么程度,要想在某个行业里成为软件老大,要看你和这个行业里的政府主管部门的关系如何。我看到了太多软件和他们公司的产品,一个字“烂”。
可那赚钱的速度,呵呵。其实赚多少钱,都是老板的,我们打工的不就是拿个死工资吗,我们更多的人不是连个受剥削的机会都找不到吗?每次面试刚从大学出来的计算机的本科生,我真想对他说:你何必要选择这一行?每次面试那些工作经历比我长,年龄比我大程序员,看着他唯唯诺诺的目光,我就想:曾几何时我也像他这样,被人横眉冷对的面试多少次,以后我是不是还会像他这样,再去看人家的脸色啊?心寒啊!
看着同期毕业的同学,都转了行的,在自己的行业里都混的不错,大部分都比自己挣钱多,有干头;就是挣钱少的,他也干的轻松啊,最简单得到就是和自己项目接洽企业或政府的信息部主管或网管,懂的不多,轻轻松松,钱比我们的多,有问题老找我们,面对他犯的低级错误,我们还得笑呵呵。我心里确实不平衡啊。

一句话,不当程序员后悔,当了程序员更后悔。

出路在哪?我在找…

1、从程序员,到系统分析,到项目经理。条件:必须是大公司,工资高,福利好,有完整的发展曲线;个人对软件开发有持续的热情。
2、转行到大型企业,事业单位,政府做信息化方面的工作(可以说是网管)。生活有保障,不必太辛苦。条件:一定的能力,一定的人际关系。
3、考研,考博再深造,出国或留校搞教学,培养一代不如一代的本科生,闲时打着大学的名义做做项目,赚个房钱。条件:高学历,一定的经济基础和家庭背景。
4、创业:这个谈起来大发了。这里只说条件:很好的项目,创业精神,一定的经济基础。
5、共享软件:很多程序员的梦想,自己写个软件全世界的卖,光注册费够一家人生活的了。成功少数,但只要有的都发达了。如ACDsee,优化大师,超级兔子,千千静听(可到共享软件区查询)。但我告诉你,这方面基本是没法干了,写个小东西挣钱玩玩可以,要靠他吃饭,饿死吧。条件:过硬的专门的软件技术,富有创意的头脑。
6、网站:基本情况和共享软件差不太多,只是比共享软件更好干点。但奇迹照样有,可看看hao123的神话和现在很牛的80后的富翁。关键你有没有这个本事和这个命了。
7、行业信息化咨询顾问:随着各个行业信息化的普及,企业对这方面人才需求很大。真正实现信息化的企业都需要这样一个既懂软件,又懂行业知识的人员,他和网管还是有区别的,他的要求更高些,更像一个自由职业者,专家类型的,这样的人放在企业里小的是个主管,大的是个副总。条件:很深的行业内部的技术或管理经验,较强的软件开发或实施经验;通常35岁以上才是成熟人才,因为经验是要经过历练的。其实就是个人物了。
8、转行,彻底的转行。干不下去,精力不够了,脑子不灵了,钱太少。只要你够理由,你就走。从新开始另一段新的生活,有什么了不起的,哪里也饿不死我这个干软件的。

我是哪种人,我说我是第8种人,看看能不能兼第5,6种人。
我大学由于种种原因没毕业,最高学历是高中,呵呵。就学历而讲,能干到我目前这个水平我觉的可以了,是时候激流勇退了。
就职业规划和财富而言,我这几年走的路并不成功,最起码无奈的转行本身就是一种失败。就我的人生而言,我觉的很成功。我了却了自己的一个人生梦想,在短时间内品尝了一个“高科技”行业的酸甜苦辣,技术出身也使我比别人多了一份淡定和从容。现在我可以放下这段旅程,再来一个新的开始。

程序兄弟们别自卑,说到优势我们有很多:

1、聪明的头脑,较高的智商。有人说程序员呆,不会为人处事,只会和机器打交道,没前途没希望。我告诉你,程序员愿意和机器打交道是因为他专注于技术,是职业特点,如果我们程序员的头脑用到一般行业,企业,政府单位里去耍耍阴谋诡计,骗骗人,卖卖产品或套套别人的话,我敢说,他们十个人也玩不过我们一个人。俗一点:就他们那点智商,也就骗骗鬼啊。

2、创新精神,学习能力和频繁的知识更新速度。做软件的都知道,干一行的软件,就得学一行的知识,这一行的知识越丰富,软件才可能写的越好。我们都具备着很好的学习能力,学习新知识,新技术的能力。不敢说每个做过的行业我们多么了解,最起码我们总是站在风头浪尖上,高屋建瓴,问题看得远,想的长(要不你怎么去设计数据库啊,呵呵)。我们能以非专业人士的角度,系统的分析出一个行业某方面的流程,那当我们就做的这个行业时,我们对我们的能力还没有信心吗?

3、扎实的工作态度,未雨绸缪的危机意识。扎实的工作态度是每个合格的程序员都应该具备的,因为我们要对代码负责;谈到危机意识,我想大多数程序员都和我一样吃者碗里的,看着锅里的吧,也是被社会逼的没办法。其实这都成了我们的优点了,以后从事哪个行业,都需要这两点精神。


我要走了,去干个和软件根本不搭边的行业,我去干是因为我是老板之一,而且钱绝对比现在好赚。过年的时候,我有个外甥刚大学毕业,非要做软件,我给他了以下建议,算是为后来者留一点东西:

1、能进大公司就别去小公司,在大公司里你能接受真正正统软件开发教育,比到小公司当个什么啥都干,啥都不精的主管强。

2、不断的学习,注意技术积累和更新,那是你唯一的资本。

3、做软硬件结合方面的开发,单片机的开发,嵌入式系统的开发,比较有前途而且门槛高。但凡基于数据库的开发,不管是.NET平台的,J2EE平台的,VC,DELPHI,PB,VB都是扯淡,其核心价值是开发人员的经验而不是技术本身。因为真正的核心技术都在国外,中国没有,我发现不管那种语言,最好用的类库或组件都是老外写的。

4、要有个好点的学历,别像我一样。毕竟是个高学历的行业,学历低人家都瞧不起你,你的发展也很有限 。30岁之前,可考虑弄个高程,CCNA,数据库管理员之类比较有含金量的证书打扮打扮自己,过了35岁其实意义就不大了。

何去何从,我们都有自己的路要走。我转行了,我就不再是程序员了吗,不!我只是不在做为别人打工的职业程序员了,我要做自己的终身程序员。闲来时我会为自己写程序,写我愿意写的。当写程序不再是一种职业而是一种兴趣和热情时,他才会陪伴我一辈子。我还会再来CSDN,做为一个非专业人士,一个轻松的真正的程序员而来。未来的一天,当我老的时候,不管那时我有什么成就,或不名一文,如果别人问起我以前是干什么的,我希望仍能自豪的回答:“我曾经是一名软件工程师”。
posted @ 2011-04-02 09:26 段英杰 阅读(78) 评论(0) 编辑

jimmy zhang 写的文章太好了,通俗易懂,深入浅出,以前模棱两可的问题现在终于云开雾散了

正如anytao所说:

来龙去脉,深入浅出,一个看似简单的问题,蕴含了丰富而又深刻的逻辑,轻松读来,收获的不仅仅是本质,还有更多的思考。。。
确实是这样的,唯一比较遗憾的是 由于 jimmy zhang工作太忙 导致一本经典的书 .net之美 无限期拖延了,真的非常遗憾,好在作者把里面有些章节都写在了博客里面。我现在整理了.net之美这本书的 目录,并按照作者博客正在整理 相关的内容,对于作者没有写的文章,我会用自己微薄的知识加上强大的博客园来逐步完善,希望园子里的朋友多提宝贵意见,我虽然无法达到子阳的技术,但是整理下来也算是对自己有个交代了。
下面贴下 子阳遵循的学习方法:
1、读书。我觉得读书还是目前获取知识的主要来源。但是看书是讲究方法的。看书最忌讳的就是手头捧着好多本,一会儿看看这本一会儿看看那本,最后的结果往往是每本都只看了开头几个章节,或者每本都只是匆忙浏览了一遍。到后来的感觉就是似懂非懂,感觉知道了会了,但是一到写代码的时候又发现无从下手。还有一个就是只看不练,看书的过程当中应该是有选择的将起码一半的代码都敲过、运行过,在这个过程中你会悟到一些更深的内容。

2、技术(或者说知识)大体上分为两类,一类是必须要掌握的,一类仅是需要了解的。所以读书也是有选择的,并不是每本书都应该一页一页地精读。合理的方法是选一到两本自己领域广受推崇的书认真钻研,反复地看(我认为一本好书看三遍的效果大于三本好书看一遍)。而其他的需要了解的知识则可以泛泛一看就行了。

3、专题研究。实际工作中你会发现大部分的书讲述的内容都是介绍性质的,也就是说都是“hello world”类的(当然也有就某个主题深入研究的书,但问题是你没有精力将每个主题都这样去钻研,也无法预见你未来可能需要对哪个主题深入了解),到实际场景中就会复杂的多。这个时候就需要针对你所处的问题进行专项的深入研究。这里最有效的方式是借助Google(英文)就你的问题搜索,我相信一定会有大量深入的文章可供参考。为什么我不说百度?可以这么说,国内对于版权的概念实在是太匮乏了,所以当你用百度搜一个主题的时候,结果往往是“一篇独大” -- 前面几页几乎转载的都是同一个内容,收效甚微。使用Google(英文)搜索,一般都可以找到一大票的相关主题,而且几乎没有重复转载的,更重要的是你会发现老外做事是非常认真的,一个主题往往讲述的很透彻,让人感觉就是生怕你不懂(这也让我明白到为什么中外有这么大差距)。唯一的要求就是你的英文水平了(可见英语对于程序员的重要性)。

4、实践。如果你没有看书,你的思维是狭窄的,当遇到一个问题的时候时,你不知道如何解决,或者你只知道用既有的解决办法而想不到有什么更好的解决途径。在平时工作中,我觉得多思考是最重要的。有不少人仅满足于完成工作任务,他们认为他们现在所掌握的技术足以应付这项工作,所以对于该任务,每次都在使用以前用过的方法在解决,而这种实践对于自己的提高是没有任何帮助的。当你发现你在做的一件工作与你不久前做的一件工作性质相同时,不要着急动手去解决它。结合你所学到的知识,思考有什么更好的办法来解决。即使你对这种新方法或者新技术并不熟练,也要尽量去尝试使用,多试几次,当你成功应用的时候,你又多了一项技能!

5、站在较高的层次去看待系统。不要仅仅限于开发应用程序的角度,而应该多注重系统的体系结构或者说应用程序的构架。开发一个应用程序是很容易的,但开发一个框架是很困难的,应该多注意模块、接口之间的关系,设计模式的应用,而不是某个方法的具体实现。最重要的是你永远要思考它有什么不足、有什么优点、有什么值得改进得地方。

6、以上5点的无限循环。

所有我认为重点的,我都标红加粗了。
以上内容希望对你有帮助。

 

posted @ 2011-03-03 08:52 段英杰 阅读(202) 评论(0) 编辑

我们主要是使用List<T>.FindAll(Predicate<T> match)进行筛选

其中Predicate<T>类型的参数,封装了筛选的规则。Predicate<T>是一个泛型委托,这意味着match参数是一个返回bool类型的方法,在FindAll()内部,会调用我们传递进去的这个方法。

public delegate bool Predicate<T>(T obj);

在讲述之前我们需要先复习一下几个概念

首先理解一下什么叫多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

多态性通过派生类覆写基类中的虚函数型方法来实现

来个例子:

 

abstract class MyAbs
      {
         
public abstract void AbMethod1();
         
public abstract void AbMethod2();
     }
     
class MyClass1 : MyAbs
      {
         
public override void AbMethod1()
          {
             Console.WriteLine(
"Abstarct method #1 of MyClass1");
         }
         
public override void AbMethod2()
          {
             Console.WriteLine(
"Abstarct method #2 of MyClass1");
         }
     }
     
class MyClient
      {
         
public static void Main()
          {
             MyAbs ma1 
= new MyClass1();// 这里就是多态
             ma1.AbMethod1();
             ma1.AbMethod2();
         }
     }

然后我们看下 如何来实现基于业务对象的筛选,主要来自 jimmyzhang的文章

页面上的代码

 

    <asp:ObjectDataSource ID="objdsOrderList" runat="server" SelectMethod="GetList" TypeName="OrderManager" OnSelecting="objdsOrderList_Selecting">
     
<SelectParameters>
      
<asp:Parameter Name="fullList" Type="Object" />
       
<asp:Parameter Name="filter" Type="Object" />

     
</SelectParameters>
     
</asp:ObjectDataSource>
        
<asp:DropDownList ID="ddlYear" runat="server" OnSelectedIndexChanged="ddlYear_SelectedIndexChanged" AutoPostBack="True">
            
<asp:ListItem Value="0">全部</asp:ListItem>
            
<asp:ListItem>2011</asp:ListItem>
        
</asp:DropDownList>
        
<asp:DropDownList ID="ddlMonth" runat="server" OnSelectedIndexChanged="ddlMonth_SelectedIndexChanged" AutoPostBack="True">
        
<asp:ListItem Value="0">全部</asp:ListItem>
        
</asp:DropDownList>
        
<asp:DropDownList ID="ddlDay" runat="server" OnSelectedIndexChanged="ddlDay_SelectedIndexChanged" AutoPostBack="True">
        
<asp:ListItem Value="0">全部</asp:ListItem>
        
</asp:DropDownList>
        
<asp:DropDownList ID="ddlCountry" runat="server" AutoPostBack="True">
        
<asp:ListItem Value="0">国家</asp:ListItem>
        
        
<asp:ListItem Value="中国">中国</asp:ListItem>
        
<asp:ListItem Value="法国">法国</asp:ListItem>
        
</asp:DropDownList><br />
        
<asp:GridView ID="gvOrderList" runat="server" DataSourceID="objdsOrderList">
                    
<Columns>
                
<asp:BoundField DataField="orderid" HeaderText="订单ID" />
                
<asp:BoundField DataField="customerid" HeaderText="客户ID" />
                
<asp:BoundField DataField="orderdate" HeaderText="订单日期" />
                
<asp:BoundField DataField="country" HeaderText="国家" />
            
</Columns>
        
</asp:GridView>

 

主要看下 objectdatasouce  里面的typename表示使用的类,parameter是select方法的两个参数,首先会调用这个方法来绑定。

看下后台代码:

 

 protected void Page_Load(object sender, EventArgs e)
    {
        
if (!IsPostBack)
        {
            AppendListItem(ddlMonth, 
12);
            AppendListItem(ddlDay, 
31);
        }
    }



    
public int Year
    {
        
get { return Convert.ToInt32(ddlYear.SelectedValue); }
    }

    
public int Month
    {
        
get { return Convert.ToInt32(ddlMonth.SelectedValue); }
    }

    
public int Day
    {
        
get { return Convert.ToInt32(ddlDay.SelectedValue); }
    }

    
public string Country
    {
        
get { return ddlCountry.SelectedItem.Text.ToString(); }
    }

    
//获取查询语句
    public string QuerySql
    {
        
get
        {
            
int year = Year;
            
int month = Month;
            
int day = Day;

            List
<string> sqlList=new List<string>();
            
string subSql = string.Empty;

            
if (year != 0)
            {
                sqlList.Add(
string.Format("Year(orderdate)={0}", year));
            }

            
if (month != 0)
            {
                sqlList.Add(
string.Format("Month(orderdate)={0}", month));
            }

            
if (day != 0)
            {
                sqlList.Add(
string.Format("Day(orderdate)={0}", day));
            }

            
if (sqlList.Count > 0)//如果选择了任意一个下拉框,那么就拼装SQL语句
            {
                
string[] list = sqlList.ToArray();
                subSql 
= " where (" + string.Join(" and ", list) + ")";
            }

            
return "select customerid,country,orderdate,orderid from Orders " + subSql;
        }
    }



    
//为列表添加项目

    
protected void AppendListItem(ListControl list, int end)
    {
        
for (int i = 1; i <= end; i++)
        {
            list.Items.Add(
new ListItem(i.ToString()));
        }
    }


    
protected void objdsOrderList_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
    {
        
//e.InputParameters["query"] = QuerySql;

        e.InputParameters[
"fulllist"= OrderManager.GetList();// 获取全部列表
        e.InputParameters["filter"= Filter;

    }

    
protected void ddlYear_SelectedIndexChanged(object sender, EventArgs e)
    {
        gvOrderList.DataBind();
    }
    
protected void ddlMonth_SelectedIndexChanged(object sender, EventArgs e)
    {
        gvOrderList.DataBind();
    }
    
protected void ddlDay_SelectedIndexChanged(object sender, EventArgs e)
    {
        gvOrderList.DataBind();
    }





    
public DateFilter<Order> Filter
    {
        
get
        {
            DateFilter
<Order> filter = new OrderFilter(Year, Month, Day,Country);
            
return filter;
        }
    }

 

还有用于筛选的类  后面我会放上全部代码  其中sqlhelper类 大家直接用微软的就OK  我就不贴了  直接放上 几个类的代码/Files/danyingjie/App_Code.rar

希望对您有帮助。

posted @ 2011-03-02 10:07 段英杰 阅读(102) 评论(0) 编辑
摘要: 正如 jimmyzhang所说的:较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。总结:(1)委托时一个类,它定义了方法的类型,使得可以将方法当做另外一个方法的参数来进行传递,这种将方法动态的付给参数的做法,可以避免在程序中大量使用if---else switch等语句,同时使程序有很好的可扩展性。(2)使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时,可以依次调用所有绑定的方法。(3)事件其实没什么不好理解的,声明一个事件不过类似声明了阅读全文
posted @ 2011-02-26 13:51 段英杰 阅读(172) 评论(1) 编辑
摘要: 最近在看jimmyzhang的文章,把自己所想到的东西记录下来,权当笔记。首先说一下泛型的好处:极大的减少了重复代码,使我们的程序更加清爽,泛型类相当于一个模板,可以在需要时为这个模板传入我们想要的类型。首先我们需要看一个 C#实现一个比较简单的冒泡排序publicvoidmaopao(int[]array){intlength=array.Length;for(inti=0;i<length;i++){for(intj=i+1;j<length;j++){if(array[i]>array[j]){inttemp=array[i];array[i]=array[j];arr阅读全文
posted @ 2011-02-26 10:35 段英杰 阅读(169) 评论(0) 编辑
摘要: 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 二、接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点:1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); 另外,接口有如下特性:接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些.阅读全文
posted @ 2011-02-25 11:03 段英杰 阅读(46) 评论(0) 编辑
摘要: 在C#中使用关键字 abstract 来定义抽象类和抽象方法。 不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例。"一个包含一个或多个纯虚函数的类叫抽象类,抽象类不能被实例化,进一步一个抽象类只能通过接口和作为其它类的基类使用."-C++ Programming Language by Stroustrup Chapter13.2抽象类能够被用于类,方法,属性,索引器和事件,使用abstract 在一个类声明中表示该类倾向要作为其它类的基类成员被标示成abstract,或被包含进一个抽象类,必须被其派生类实现。abstractcla阅读全文
posted @ 2011-02-25 10:51 段英杰 阅读(251) 评论(0) 编辑
摘要: 一个带输出参数的存储过程的例子:ALTER PROCEDURE [dbo].[GetCustomers](@rowcount INT OUTPUT)AS SELECT [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode] ,[Country] ,[Phone] ,[Fax] FROM [Northwind].[dbo].[Customers]SET @rowcount=@@rowcount 再给一个有返回值的存储过程 ALTER PROCEDUR阅读全文
posted @ 2011-02-25 09:37 段英杰 阅读(641) 评论(0) 编辑