[藏]关于B树的一篇文章

很多人对B树的理解有很多错误,我看的最多的就是有人混淆二叉树(Binary Tree)和B树(B-Tree),二叉树是不用简称,也就是BT的,而特殊一点的二叉搜索树才会用BST(Binary Search Tree),至于B-树和B树,这两个其实一样的,英文都是(B-Tree),注意看中间的-号,这个是国内翻译的问题.所以大家不要被误导. Rudolf Bayer 和 Ed McCreight 于1972年,在Boeing Research Labs 工作时发明了B 树,但是他们没有解释B 代表什么意义(如果有的话).Douglas Comer 解释说: 两位作者从来都没解释过B树的原始意义。我个人觉得很有可能是他的名字,程序员对其作品的一种情结吧. 这篇文章来自国外,是某大学的CS课程在线的,由于有时候无法访问,我直接提供PDF版,对其构造过程非常清晰.非常非常好的B树教程,图示很多,就不翻译了,强烈推荐阅读!  下载:B树讲解  

[藏]熬就一个字

文/冯仑 男孩子最大的问题,30多岁自己还没有成功。 现在社会反差特别大,怎么坚守自己的人生目标就特别难,随波逐流总是成本低,但对自己不负责任,不如设定一个特别大的目标,然后熬,一直熬下去。 熬是个什么概念? 20多岁刚毕业,你是社会的边缘,什么事都是哥哥、姐姐、30多40多的人在做,你得求这些人;等到30多岁,你开始进入到剧场最后一排,有了一张门票可以看别人演;到40、50岁,就是中排靠前一点的观众,看戏你就可以看的清楚了;你如果要出类拔萃就变成第一排了,再出类拔萃你就成演员了,等到你演完了,别人一鼓掌你也就该下场了。 20多岁一定要有一个准备,你就是边缘,边缘是尽快拿到入场券。比如说你到了公司,有了一个稳定的职业,或者一个基本稳定的生活,但是你乘自行车、赶公共汽车,这就是入场券,很正常。 我研究生刚毕业,中间工作八年,每天骑自行车赶到374,然后坐公共汽车,公共汽车下来再走一站地。回头想来不委屈,20多岁肯定是这个过程,如果20岁就跟50岁人一样,那这个戏就乱了,中国十几亿人都这么演的。插队是偶然性,比如像丁磊他是另外一种人生,这种概率极小极小,你可以朝着奋斗。 成功不是设计出来,是靠信念支撑,加上各种机遇偶然蹦出来了。当你成演员,基本上也该谢幕了,接下来又来了人,这个戏才能不断唱。现在70多岁人基本上又退回到场外了,看他儿子演孙子演,就这么一茬一茬。 熬要有耐心,熬不是你一个人熬,而是一代人熬。

[E].Net 多线程指南

这是codeproject上的一个系列。我看完了。收获匪浅。可惜作者之后未能更新预想中的总结贴,多少有些可惜,不过。此系列非常非常不错。建议想学习.net多线程的看看。 1.net 多线程介绍 Introduction into threading in .NET 2.线程周期/线程优势/陷阱 Lifecycle of threads/Threading opportunities/Traps  3.线程同步 Synchronization 4.线程池 Thread Pools 5.UI中的线程应用 Threading in UIs (WinForms / WPF / Silverlight)

详细讲解双查询注入

上一篇文章中,http://leaver.me/archives/2726.html 我说双查询很难讲清楚,这次就试着讲一下。读了一些原理性的东西。然后尽量通俗的给大家讲清楚。。 在此之前,我们理解一下子查询,查询的关键字是select,这个大家都知道。子查询可以简单的理解在一个select语句里还有一个select。里面的这个select语句就是子查询。 看一个简单的例子: 真正执行的时候,先从子查询进行。因此执行select database() 这个语句就会把当前的数据库查出来,然后把结果传入到concat函数。这个函数是用来连接的。比如 concat(‘a’,’b’)那结果就是ab了。 原理: 双注入查询需要理解四个函数/语句 1. Rand() //随机函数 2. Floor() //取整函数 3. Count() //汇总函数 4. Group by clause //分组语句 简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。 以本地一个名为Security的数据库为例 首先在bt5下的命令行下输入 就会连接上数据库了。 然后通过use security; 就可以切换到security数据库了。因为一个服务器上可能有多个数据库嘛。 然后我们执行一下前面那个简单的子查询的例子 就能显示security,也就是显示了当前数据库的名字了。 然后我们测试一下concat的用法。输入 显然结果就是string1string2了 然后我们测试一下rand()这个随机函数是干嘛的 我们多执行几次 可以看到,这个函数就是返回大于0,小于1之间的数 然后看看取整函数 这个函数就是返回小于等于你输入的数的整数。 然后我们看看双注入查询中的一个简单组合。大家从我的上一篇文章中应该也看到了有一个子查询是 我们从里向外看。rand() 返回大于0小于1的小数,乘以2之后就成了小于0小于2了。然后对结果进行取证。就只能是0或1了。也就是这个查询的结果不是1,就是0 我们稍微加大一点难度。看这个查询 不要怕。先看最里面的SELECT database() 这个就返回数据库名,这里就是security了。然后FLOOR(RAND()*2)这个上面说过了。不是0,就是1.然后把这两个的结果进行concat连接,那么结果不是security0就是security1了。 如果我们把这条语句后面加上from 一个表名。那么一般会返回security0或security1的一个集合。数目是由表本身有几条结果决定的。比如一个管理表里有5个管理员。这个就会返回五条记录,这里users表里有13个用户,所以返回了13条 如果是从information_schema.schemata里,这个表里包含了mysql的所有数据库名。这里本机有三个数据库。所以会返回三个结果 现在我们准备加上Group By 语句了。 我们使用information_schema.tables 或 information_schema.columns者两个表来查询。因为表里面一般数据很多。容易生成很多的随机值,不至于全部是security0,这样就不能查询出结果了。 这里我先解释一下。我们把concat((select database()), floor(rand()*2)) 这个结果取了一个别名 a ,然后使用他进行分组。这样相同的security0分到一组,security1分到一组。就剩下两个结果了。 注意。这里的database()可以替换成任何你想查的函数,比如version(), user(), datadir()或者其他的查询。比如查表啊。查列啊。原理都是一样的。 最后的亮点来了。。 我们输入这条:注意多了一个聚合函数count(*) 报错了 重复的键值 可以看到security就是我们的查询结果了 想要查询版本就这样: 看看替换了database()为version() 再看一个 报错 这里的~这个符号只是为了让结果更清晰。 这里还有一个比较复杂的。叫做派生表。需要使用 select 1 from (table name); 这样的语法来报错,具体就是 来报错。 大家可以对照我上一篇文章来看。相信讲的还算清楚。

C#中的Debug类

位于命名空间System.Diagnostics中 1.Debug.Print方法 2.Debug.WriteLine方法 3.TraceListener类 DelimitedListTraceListener创建的时候指定一个文件名,当Flush调用的时候,就被覆写到文件里。 4.Debug.Write和WriteIf以及WriteLineIf方法 第一个参数一个bool值,为真则输出。 5.Debug.Assert方法 如果表达式为false,则输出。

消费者行为学

今天一直在自习。。中午遇到了初中同桌。。5年没见了吧。聊了一会。被各种叮嘱“一定不要找太娇生惯养的,太粘人的,太无理取闹的。要听我的话,不然受苦的可是你。”哈哈。当时笑喷了。谢谢同桌。好好工作吧。  这本书是寒假在家看的一本书。一点点笔记。  选择喜爱的网站在很大程度上是一种生活方式的声明,它说明了一个人的兴趣和他想成为哪一类型的人,人们选择一种产品。通常是因为他们喜欢他的个性,觉得和自己比较温和。甚至有些人认为,使用产品后,他所拥有的令人渴望的品质会转移到自己身上。  每一年,人们都会购买大量几乎没有任何味道,没有任何营养的食品,这说明现代消费者行为学领域的一个基本前提是,人们购买产品往往并非因为他们能做什么,而是因为他们意味着什么。在其相同的情况下,人们会选择那些具有与其潜在需求一致的形象/个性的品牌。  营销者与消费者共处于一种复杂的双向关系中,往往很难判断营销活动是在哪里结束,而“真实世界”又在哪里开始,这种界限的模糊带来一个结果,那就是我们不再确定(或者也不在意)区分虚构世界和现实的界限究竟在哪里。有时候,我们呢愉快地加入到这个幻想中。  商业道德是引导市场行为的原则。包括诚实,可信赖,公平,尊重,正义。消费者认为行为道德的公司制造的产品评价较高。  品牌是在消费者头脑中设立的账户,也许巨额投入的营销策略只可以提高一个品牌的小小美誉度,而一次不大的产品质量危机则可能会一夜之间让该品牌资产荡然无存。  需求是一种基本的生物动机,欲望是社会教给我们的可用以满意需求的一种方式,比如口渴是生物意义上的,而我们被教会用可口可乐而不是(比如)羊奶来满足解渴的需要,因此,需求是本来就已经存在的。营销者只是推荐满足他的方法。营销的一个基本目标就是引起人们认识到需要的存在,而不是创造需求。  广告人对于人们的了解还远远未达到操纵他们的程度,新产品的失败率从40-80%,尽管人们认为神奇手段和科学技术在操纵他们,而事实上。只有设法销售优秀产品时才会成功。  绿色营销越来越普遍。强迫性消费是指反复的而且常是过度的购物行为,他被当作压力/焦虑/沮丧/无聊的宣泄渠道。和毒品类似。女性观有强迫购物失常的概率是男性的4倍,女性被服装和化妆品吸引,男性则被小配件,工具,枪支等吸引。

装逼尚未成功,同志仍需努力。

本文来自河蟹娱乐,看到的时候让我想起了《娱乐至死》和《瓦尔登湖》,总之,不打算拯救世界,也不在乎别人装逼,生活什么的,简单最好。文中观点也许略有偏颇,读者自己心中有数即可-bystander  你受过良好的教育,有意无意间说起自己的大学,旁人无一例外纷纷投来艳羡目光。你工作光鲜,不是四大就是4A,不是垄断国企就是全球500强;在一个都是中国人的公司里互相叫对方英文名。你衣食无忧,三个月工资买一LV包;你生活清闲,上班时就像神九的航天员,明明啥事没干还要装出一副很忙的样子;你格调不俗,业余时间不是昆曲就是话剧,不是民谣专场就是妈妈咪呀;你善良正义,身处斗室,胸怀天下,每天吃饱饭就刷刷微博拯救中国。  你用苹果,买个五千块的马脸iPhone,又是贴膜又是镶钻,十天换八个壳;你用谷歌,买个两千块的安卓手机,又是S-OFF又是ROOT,十天刷八个ROM。你关注互联网,精通电子产品,上机锋网威锋网雷锋网,电脑里永远装着十个GTD软件八个思维导图软件,用Instagram记录生活,对乔布斯比对你爸还了解,以果粉自居并喜欢到论坛上问:iOS6完美越狱什么时候出来啊?  你发烧,你还发骚,出门带着IPC,用麻绳绑个随身耳放,再配一对ER4P入耳式耳塞,完全隔音,也不怕被车撞死。嫌不够惹眼?那就换一副时下最流行的魔声Beats Pro头戴式耳机,每一个苹果旗舰店的配件区里都有卖,它颜色鲜艳外形时尚,两个耳朵每边印着一个b,挂在你的头上,真是实至名归。  你叫自己“吃货”,可怜的娃从小在城里长大没吃过什么好东西,为了美食频道里推荐的坑爹路边摊,坐10块钱地铁从城南干到城北。你热爱美食,每次花十分钟炒菜,二十分钟摆盘,三十分钟拍照,拍好导进PhotoShop里用康熙字典体配上两句文言文,传到博客上豆瓣上微博上。  你文艺青年,琴棋书画样样不通,格律没搞懂就敢写古诗词,最爱莎士比亚的英雄双行体。你只到电影院看电影,提到外国电影从不说中文名,也不说英文名,管《指环王》叫LOTR,《蝙蝠侠3》叫TDKR,倍洋气倍有面子。你一听到维瓦尔第的《四季》,就会想起波光粼粼的日内瓦湖和白雪皑皑的阿尔卑斯山。  终于有一天,当你拿着一张音乐会赠票睡死在钢琴声中,当你附庸风雅跑去看毕加索画展却一张画也没看懂,你突然意识到了自己的浅薄。没有金刚钻,怎装瓷器逼?没有付出,哪来收获?  装逼没有那么容易,才会特别让人着迷。  你开始认认真真地看书,时间宝贵,你只看经典,抬手就是中华书局、上海古籍,各种珍本善本影印本,横排版的书不看,简体字的书不看。理论学习也不能落下,商务印书馆汉译世界学术名著丛书买它个几十本回来,黄的绿的橙的蓝的,书架上一排彩虹。  你偷偷把手机铃声从《我的歌声里》换成肖邦的夜曲,王菲、张国荣的CD扔掉,你万青,你痛仰,你Pink Floyd,你Guns N’ Roses,你从流行听到爵士,从摇听到古典,别人问起你最喜欢的歌手,你四十五度角仰望星空,眼神虔诚地说出一句:“In Bach We Trust。”念到Bach的ch时上腭抬高,发成“喝哈”轻读加连读的效果,一口纯正的小舌音,德味!  数码单反是不能再用了,现在连旅游团的大叔大妈们都人手一只无敌兔了。相机一定得是胶片的,胶片一定得是120的,拉开你们家冰箱,啥吃的没有,满满的全是胶卷——还必须得是过期的。  国内景点是不能再去了,水乡古镇全是搞一夜情的,西藏全是又酸又穷除了会辞职什么都不会的城市小白领。你背包,你户外,你特立独行无所畏惧,你穿Columbia防水鞋、NorthFace冲锋衣,你用GPS迷了路,在黄山的雨夜里发出求救信息。  你张开双手去生活去爱,你受了伤害,你的小心脏扎满绷带。你痛不欲生,你长夜痛哭过人生,痛完哭完后你顿悟你看透你蜕变,你长了一分智慧叫阅历,你多了一分气质叫成熟。你情感专家,你麻辣教师,你知性姐姐。你豆瓣粉丝几万,微博粉丝几十万,你吊了个有房有车有钱的金龟婿,然后教小姑娘们什么是爱情;你一天到晚不干正事,然后教小朋友们如何治疗拖延症;你做了个朝九晚五的无趣上班族,然后教大学生们别放弃梦想。你读书写字做主妇,你把体内毒素分泌成畅销书。你解答粉丝来信,聆听读者倾述,你款到发货,话到病除。你忙着生产一种叫“正能量”的东西,没有它,你的读者将无以为继,夜夜痛哭。  你研习人类学、社会学、历史学、植物学、建筑学、心理学,你掌握六门外语:英语、法语、德语、日语、西班牙语、铁岭话,你知道康熙他小舅的二大爷哪年死的,你分得清古典柱式认得出欧洲广场,你叫得出路边一花一草的科属名字,你开口M2闭口流通性过剩,你和同好攒了个铅笔经济研究社,研究除了经济学以外的任何东西。  只有门外汉才会在听古典音乐的时候想到什么画面,你谈论的是作品的母题、动机、织体、转调、升降、横向展开的层次与纵向展开的速度。你告诉还在听莫扎特“我不想不想长大”和贝多芬“当当当当”的新手:不妨尝试一下莫扎特和贝多芬的钢琴协奏曲,尤其是莫扎特的K.491和K.595,贝多芬的Op.37和Op.73,精彩绝伦,不输给他们任何的交响乐作品以及歌剧。你对中产气味古典主义模仿者勃拉姆斯充满轻视,对婆婆妈妈的柴可夫斯基只有厌烦。斯特劳斯里面只能听听理查·斯特劳斯,他的艺术歌曲还算有那么点思想性;至于约翰·斯特劳斯,天啊,真不知道这个家伙除开写了几首平庸的圆舞曲外还干了些什么。  你上知天文下知地理,对世界充满好奇心和求知欲,没事就到网上破解谣言。你三十好几找不到对象,去非诚勿扰相亲告诉人家“喜欢TBBT加分哦”,结果“可惜不是你,陪我到最后……”。你在粉丝面前表演Name Dropping的把戏大秀才艺,隔天一觉醒来照旧要加班熬夜做苦力,供房养车还利息。  你有知识有思想有文化有品位,唯独没有钱。你浑身上下散发着狐臭般无法抗拒的人格魅力,唯独没有活人鸟你。  装逼尚未成功,同志仍需努力。  你苦心智、劳筋骨、饿体肤,长夜痛哭算个屁,未曾坐过春运绿皮车者,不足以语人生。你比别人聪明你还比别人勤奋,你睡得比别人晚起得比别人早,你头发一天比一天少,肚子一天比一天大,鸡鸡一天比一天软。“吃得苦中苦,方装逼上逼”,皇天不负苦心装逼的人,你行业老大了,你商界精英了,你社会名流了,Finally, You did it, You DID it!  你实现了“财务上的自由”。你从不像其它男人一样热衷讨论好车,一般你的做法是:买一辆。不过,好车没什么值得炫耀的,车再好能好得过煤老板的?身为“中国知识新贵”的你,更喜欢邀请朋友到家里听自己两百万的Hi-End系统上播放的马勒和布鲁克纳。你听音室里的唱片的总价能买三辆奔驰,你用十三种工具调整自己唱机唱臂的位置,你告诉朋友,玩音响最关键的不是音源,也不是音箱,而是电:水电偏冷,火电偏暖,核电偏硬,你只用来自新疆阿克苏的风电,宽松醇厚。  你从微软跳到谷歌,最后弄个创新工场,做出了市面上最好的安卓盗版装机软件。你是中国的雷布斯,三千块市价的安卓手机你只卖两千块,除了一直缺货外,没什么不好的。  你从英国回来,都不用做学问搞研究,把民主的细节背诵一遍就当上了副教授。你出国就去冰岛,斯堪的纳维亚那块,北欧冰冷的气质才衬你高洁的内心,哦,对了,出门前记得把所有微博删掉。  你是央视主持人,你抑郁了,你又好了,你开着豪车到人民大会堂骂执政党的娘,骂完回台里继续主持读书节目;你血水盐水里泡过,说十句话引用八句名人名言,采访的时候总像只孵蛋的鹌鹑一样看着对方,你内心强大业务出众文笔一流,更要命的是,你还穷,谁敢不喜欢你简直天理难容。  你文学青年,你杂志主编,你说看不懂你小说的人是傻逼,看不懂你小说的人就是傻逼;你说文学有金线,文学就有金线。你眼光高,天底下看得上眼的东西就两样:美玉和鹌鹑。你率性随意,什么都可以将就,但避孕套一定要用最薄的。  你为民主民权民生摇旗呐喊,早年带老婆到天安门广场拍露逼照,直接则对城楼上的人像竖中指,好像很厉害的样子,可惜被查过一次账后就痿了,回来后一副受尽人间辛酸的萌样,像闰土一样四处找粉丝借钱,谁看谁心疼。  你老了,头发胡子花白,你归隐田园,深藏功与名。你心情不好就打个飞的去伦敦喂鸽子,去尼泊尔爬珠穆朗玛峰,心情好的时候就给干女儿做一盘难看但好吃的红烧肉。  你会当凌绝顶,一览众逼小。你再也不需要装逼,因为,你就是逼。  你安然地度过了一生,死后安葬在宁静的故乡,野花轻轻覆盖你的墓碑,上面镌刻的六个大字清晰可辨:  “活过,爱过,装过。”

双查询注入

作者:bystander 论坛:法客论坛 这个东西比较难解释。我就不多解释。尽量通过这篇文章大家能够照猫画虎手注即可。想要深入理解的可以去看看mysql数据库的一些知识 介绍一下双查询注入,有时候我们通过order by 语句获取到了确定的列数,可是当我们使用union select或union select all查询的时候, 却会出现一个错误提示,列数不一致。 而我们使用下面的语句: 执行之后就会显示mysql版本,用户名,服务器名, 以及数据目录… 获取数据库里 许多人会在上面的语句里使用:database()方法来获取数据库, 可是。这个方法只能获取一个数据库。如果你入侵的网站存在多个数据库。上面这个查询就不能用了因此使用下面这个方法更好些。。 不同点在于第二个查询语句在information_schema.schemata里查询 schema_name ,这样就能查到所有的数据库了。 注意语句中的Limit 0,1会显示地一个数据库,改成 Limit 1,1 会显示第二个 Limit 2,1 会显示第三个, Limit 3,1 会显示第四个。。以此类推。 补充个: 在普通的SQL注入中,使用如下的语句 会一次爆出所有的数据库 而使用下面的 只会显示当前站点使用的数据库。 获取表名 回正题,我们继续使用双查询来获取数据库的表: 注意语句中的table_schema=0xHEX 这里的hex用你要查询的数据库进行hex编码后替换即可。 同样的,这里可以要修改LIMIT后面的值来得到第二个第三个第四个表。 获取列名 然后我们来获取列名: 和上一句很像,注意这一句"And table_name=0xHEXEDTABLENAME" 还是一样的。后面的部分是要查询的表名的hex值,同时,通过增加后面的LIMIT值来获取更多的列名。下面是大家最感兴趣的地方。。从列里面取值。 获取列值 一些人使用: 也就是他们使用tablename.columnname 有个缺点就是一次只能获取一个列的值,要是该表有个1000多列啥的。。一个个就了。。为了更快一些。后来很多人开始使用这个: 这样一次就能获取多个列的值了,但是还有个bug,因为是直接从mysql的所有表里面找,并且没有指定数据库名,如果mysql有两个数据库有同样的一个表名。那么这样找出来的就不知道到底是哪个了。。就混乱了。。所以。现在我们用这个: 好处一个是可以一次获取多个列的值,同时使用 database.table, 可以明确我们要找的表了。不要忘了增加LIMIT来获取下一条记录啊 错误之处还请指正。

你是想读书,还是想读完书?

本文来自知乎,我的看法呢,同意作者的。但不完全是这样。每个人都会建议你把好书读千百遍。改变自己什么的。其一,别人认为的好书不一定能启发你。因此,需要多读书来遇到那本如来神掌,其二。对于非技术书来说,作者的观点是正确的。人文,心理这类书绝对不在多。在于书为了自己的一部分。改变了自己。而技术书无此功能。多读多做才能进步。 本科时,一位很有才华的心理学老师说过的一句话,让我终身难忘: 很多同学喜欢说自己一天能读多少页的书,有些人一天能读50页,有些人能读100页。可是一旦你用“页数”为单位来度量读书这种行为时,从一开始你就错了。 同理,我想对题主说,你用读了多少本书来形容你的读书经历,这种思路,从一开始就错了。 如果你认真读到了书里去,是不会care、甚至会完全忽略掉今天读了多少页,今年读了多少本的;当你沉迷于书中绚烂多彩的世界,当你的观念被翻天覆地地革新,是不会care、甚至会完全忽略掉今天读了多少页,今年读了多少本的。 当我们看手表的时候,常是快等不及了;当我们数书页的时候,常是快看不下去了;当我们念叨看了几本书的时候,常是连书名都记不全了。所以,数多少页、多少本这行为本身,就说明你已经败了。 很多时候,一个人对待知识和思想的态度,就体现在用什么东西去丈量它。 如果有人问一位读书而有大成之人:你因何而脱胎换骨?你因何而涅磐重生?这些问题,他该如何作答?他说:”我因200本书而脱胎换骨,我因1000本书而涅磐重生“,如何? 学而悟道,有时候一本书就够了,有时候一万本都不够。这取决于,你读了什么书,更重要的是,你是如何读的:你有没有读进去把自己活埋在里面,又有没有读出来敲打出一个新的自己。 有些书,是一代宗师级的人物,把他们毕生的智慧熔铸在一本书里面;有些书,是一个领域的开疆拓土之作,从一片混沌中劈出一个新世界;有些书,是一个领域的集大成之作,观点纷繁,气象万千;有些书,如盗梦空间一般有几层境界,你多读一遍就多梦到一层。对这些书,你若只是都当成那两百分之一,花上一个星期匆匆读完,读后即扔,只摘下几条金句供日后泡妞之用,难道这就算读过了吗? 有些书,要用心血去读;有些书,要用足够的经历去读;有些书,是要绞尽最后一粒脑细胞去读;有些书,是一辈子都读不完读不透…… 看书的方法,不仅要看作者写了什么(一层),还要琢磨文字背后的意蕴,那些弦外之音(二层),还要去思考作者为什么要写这些、要这样写(三层),还要去想想看作者用了什么样的框架和策略在组织这本书,以及在各种细微处又用了什么样的方法和技巧(四层),当然更重要的是,以上的这些分析对你自己的现实和精神世界能带来什么样的帮助,是否能启发你、引导你、改变你……(五层) 于是,一本值得都烂读透的书,就需要你去读五遍、十遍去读烂读透它。 于是乎,和很多人的答案相反:所谓200本,你不是读少了,而是读多了、读水了、读浅了! 其实你的状态一点都不特殊,你和许多人一样,以为自己在读书,其实是在集邮。 最后,建议你重新拿起一本你最崇敬的书,换一种方式,再读一遍、两遍、三遍……

C#反射实现简单的插件系统

如果用过一些优秀的开源或是非开源的应用软件,就会发现这些软件的一个很大的优势就是其开放性,任何有能力的人都可以为其开发不同的插件来增强其的功能。比如著名的foobar2000,Vim和TotalCommander等等。 C#的反射可以用来实现一个简单的插件系统。思路很简单,我们创建一个解决方案,包含三个工程,一个为我们的软件MyApplication,一个为插件接口IPlugin,一个为具体的插件MyPlugin。插件系统的基本思路是我们用一个接口类库,来定义我们软件可以使用的插件必须实现的方法签名。然后我们的软件MyApplication通过引用该IPlugin dll来动态调用,而具体的实现插件MyPlugin则引用该接口来实现具体的方法。这样我们的应用程序就能在不知道具体插件的情况下调用插件了。。 结构图如下: 关键代码也就是通过对程序集载入。搜索到对应接口的实现类。然后调用即可。 运行结果: 源码下载:PluginSystem.zip