寻得乐中乐

想通过自己的自学之路,和大家分享我这个初学者的学习心得,也从一个初学者的角度来研究code. 相信Coding的道路上永远有贵人相助.

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  52 随笔 :: 1 文章 :: 9 评论 :: 0 引用

公告

2012年4月26日 #

使用C# yield关键字来提高性能和可读性

 

对于”yield”这个关键字我已经见过N次了,直到最近我才知道这个关键字所蕴含的力量。我将在下面展示出一些使用”yield”让你的代码有更高可读性和更好性能的例子.
为了让你对yield有一些快速概览,我首先要展示一个没有使用这个关键字的例子,下面的代码很简单,但在我最近的项目中却很常见

  1. IList<string> FindBobs(IEnumerable<string> names) 
  2.     var bobs = new List<string>(); 
  3. foreach(var currName in names) 
  4.     { 
  5. if(currName == "Bob") 
  6.             bobs.Add(currName); 
  7.     } 
  8. return bobs; 
  9. }

注意在这里我使用IEnumerable<string>作为参数类型并以IList<string>作为返回类型,通常来说,我更倾向于在参数输入的类型方面的范围越宽越好,但在返回类型上面更加严格(译者按:即输入时多用基类或接口,返回时用子类或实现类),对于输入来说,如果你需要用foreach来对其进行循环的话,使用IEnumerable会更有意义。而对于输出(译者按:也就是返回),我使用接口来让实现部分可以改变。在这里我想让调用者省去生成列表的麻烦,所以我选择list作为返回类型.
而问题在于,我的设计并不具有可链接性,这样的设计需要产生列表作为返回值,实现上,这个列表或许不会很大,但这并不必要
现在,让我们来看看以“yield”的方式来做这些,而后我会解释如何使用它,以及它工作的原理。

  1. IEnumerable<string> FindBobs(IEnumerable<string> names) 
  2. foreach(var currName in names) 
  3.     { 
  4. if(currName == "Bob") 
  5.             yield return currName; 
  6.     } 
  7. }

在这个版本中,我们将返回类型改为IEnumerable,并且我们使用”yield return”.注意我再也不需要创建一个列表,现在是不是有些迷惑的?别着急,在理解它的工作方式的情况它会变的越来越简单.
当使用”yield return”关键词组时,.net会为你生成一大串管道代码,你可以尽管假装这是个魔法。当开始在被调用的代码中循环时(这里不是list),实现上发生的是这个函数被一遍一遍的调用,但每一次都从上一次执行退出的部分开始继续执行.
传统的执行方法
调用函数
函数执行并返回list
调用部分使用返回的list

Yield的执行方法
调用函数
调用者请求item
下一个item返回
回到步骤2
虽然yield执行的实现貌似有些复杂,但我们最终只需要一次“弹出”一个item,而不是创建整个list并返回.
对于句法说,我个人认为yield更加简洁,并且对于传递函数的用途表现的更好(译者按:也就是代码可读性),我使用IEnumerable作为返回类型来通知调用者它可以被foreach循环并且返回数据,而调用者现在可以自己决定它是否愿意将返回值存放到列表中,即使这会以性能作为代价。
在我提供的这个简单例子中,也许你并不能发现很多使用yield的好处,然而,你可以在调用者需要取消遍历所有的函数提供的内容时节省很多不必要的工作,当你在方法链接时使用yield,你可以省下的工作(时间)或许会成倍叠加。
Ayende已经有了很棒的例子:using yield for a slick pipes & filters implementation,他甚至还讲述了:version that is multi-threaded。这让我觉得非常有趣.
最开始我对yield的保留意见是使用这个关键字或许会导致潜在的性能问题,但实际上,至今为止我还未能发现任何信息来说明关于yield对性能的影响,而我在上面提到提高性能的地方远远大于编译器overhead那部分

posted @ 2012-04-26 17:52 寻得乐中乐 阅读(5) 评论(0) 编辑

2012年4月4日 #

text()在IE与Chrome作用不同

 

今天需要在一个id是txtMessage的textarea里面取值,做了半天发现在IE和Chrome中使用text()结果不同

 

$(document).ready(function () {
   $("#btnSubmit").click(function () {
       var t = $('#txtMessage').text();
       alert(t); //在Chrome里面啥也没有,IE8,9都是正常的   });
});
 
查了一下资料,原来这个text取的是元素的innerText,这个值在IE和Chrome里面是不一样的,IE直接把textarea里面的值放在里面,而Chrome则不是
解决方法也非常的简单,使用val()方法,即
改变var t = $('#txtMessage').text(); 成为 var t = $('#txtMessage').val();
 
另:除了textarea,建议val()方法也用在input,select这些中表单元素的取值中!
posted @ 2012-04-04 22:29 寻得乐中乐 阅读(29) 评论(0) 编辑

2012年4月2日 #

jQeury顶级对象 缩写$


1、$(document).ready(function(){
   
})
dom加载完成后触发
window.onload
    只能注册一个方法
    页面所有内容加载完成后触发(图片,css,js都加载)

    缩写
        $(function(){
        })
2、jQuery对象(包装集)  dom对象
    var div = document.getElementById("id") dom对象
    var div = $(".class") 包装集,对dom对象包装,返回的是很多个dom对象
3、jQeury选择器
    $("#id")
    $(".class")
    $("input")
    复合选择器 $("#id,.class,input")
    *
4 $(who).when(what)  $("#btn").click(function(){})
5、层次选择器
    $("div p") 包含选择器 div中所有的p 子元素 子子元素..
    $("div > p")  子后代选择器 div中直接子后代
6、常用的方法html()  text()  val()  attr()  css() removeAttr()
6.5 节点遍历
    next()  nextAll()
    prev()  prevAll()
    siblings()
    end()   andSelf()
7、简单选择器
    :first 选取第一个元素   $("div:first")
    :last 选取最后一个元素
    :not(选择器) 选取不满足“选择器”条件的元素$("div:not(#id)")
    :even、:odd,选取索引是奇数、偶数的元素
    :eq(索引序号)、:gt(索引序号)、:lt(索引序号)
8、设置样式
    css()
    attr("class","...")
    addClass("myclass")(不影响其他样式)
    removeClass("myclass")移除样式
    toggleClass("myclass")如果存在样式则去掉样式,如果没有样式则添加样式
    hasClass("myclass")判断是否存在样式
9、链式编程
    $(this).css("background-color", "red").siblings().css("background-color", "white");

---------------------------
10、属性过滤选择器
    $("div[id]")选取有id属性
    $("div[title=test]")选取title属性为test的元素
    $("div[title!=test]")选取title属性不为test的元素
    etc....查看帮助
11、表单选择器
    $(":input")匹配所有 input, textarea, select 和 button 元素
    $(":text")匹配所有 匹配所有的单行文本框
    $(":checkbox")匹配所有复选框
    etc.....查看帮助
12、动态创建Dom
    var link = $("<a href='http://www.baidu.com'>百度</a>");动态创建jquery对象,只是在内存中
    $("div:first").append(link);  把动态创建的jquery对象,加到第一个div中
   
    动态创建dom注意:
        var some = $("<div id='d1'>a<p></p>c</div>")
        当把动态创建的节点添加到窗体前,不能通过$("#d1")访问到它
        必须先把some追加到窗体
        $("div:first").append(some);
        才可以通过$("#d1") 中找到它

    append   把link元素追加到哪$("div:first").append(link); 
    appendTo  link.appendTo("div:first")   
        在结束标签之前添加元素
    prepend
    prependTo
        在开始标签之后添加元素
    after
    afterTo
        在结束标签外添加元素
    before
    beforeTo
        在开始标签前添加元素

13、删除节点
    remove()  删除当前节点
    empty() 清空当前节点之间的内容,节点保留

14、*替换节点
    $(“br”).replaceWith(“<hr/>”); 
15、*包裹节点
    wrap()将所有元素逐个用指定标签包裹


----------------------
16、绑定事件
    绑定事件 $("#id").bind("click",function(){})
    解除绑定 $("#id").unbind("click")
    让事件只执行一次 $("#id").one("click",function(){})
    合成事件hover  toggle
        hover(enterfn,leavefn)  当鼠标放上时执行enterfn,当鼠标离开时执行leavefn
        toggle(fn1,fn2) 当鼠标第一次点击时执行fn1,第二次点击执行fn2,以后依次执行
17、事件冒泡
    mouseover、mouseenter   mouseover会事件冒泡,mouseenter不会
    mouseout、mouseleave
   
    阻止事件冒泡
    $("#d1").click(function(e){ e.stopPropagation();})
18、*事件参数
    pageX、pageY
    target 获得触发事件的元素
    altKey、shiftKey、ctrlKey
    keyCode 键盘码、charCode  ascii码
19、动画
    show()、hide()
    toggle()  切换显示隐藏
    slideDown、slideUp、 fadeOut、fadeIn
    animate 复杂动画

posted @ 2012-04-02 22:52 寻得乐中乐 阅读(351) 评论(0) 编辑

2012年2月22日 #

感谢涂雅的投递

新闻来源:涂雅

现在越来越多的公司进入到移动互联网这个领域,选择HTML5做跨平台的解决方案,还是针对不同的平台开发,这是一个十分艰难的选择。早期的技术选型很重要,稍有不慎,后患无穷,是超前使用HTML5,还是稳妥地针对性开发,或者两者折中

随着移动设备越来越先进,对HTML5的支持度越来越高,我们进军移动领域的时候,都会遇到一个问题,是选择HTML5和还是Native(用原生代码编写的本地程序)HTML5的前景无疑是诱人的,一句“Write once, run anywhere”就可以秒杀一切。笔者最近两年来对HTML5Native有较为深入的研究,觉得两者之间不能仅仅是二分法来选择,还要根据企业自身的情况、团队的构成、公司的战略以及产品的特点来综合选择。

 

HTML5的发展前景我无疑是非常看好的,各大公司也不遗余力的推动,目前主流的三大智能机操作系统iOSAndroidWIndows Phone都已经支持大部分的HTML5特性。而移动设备硬件军备竞赛也为HTML5扫清硬件障碍。按照现在的发展速度,我判断是在三年以内甚至更快,移动设备运行HTML5将会完全没有压力,无论是标准还是硬件。现在主流的智能机已经配置双核浏览器和1G及以上的内存,今年再出智能机没这个配置你都不好意思发布了。

 

谈谈HTML5

 

1.HTML5可以让你摆脱对平台的依赖,用户打开浏览器,直接就可以访问你的应用,而不需要经过各种Store的审核。

 

2.实时更新,通常平台的审核都需要七个工作日左右的时间,如果你发布之后发现问题怎么办?Web方式就不存在这种问题。

 

3.Write once, run anywhere?

 

这是多少程序员的梦想,也曾经是Java让人心动的地方,但真正做过跨平台解决方案的人都知道,这只是一句口号而已,跨平台没那么容易玩转的。没错,HTML5可以实现Write once, run anywhere,但我们总不能写一个Hello Worldrun anywhere吧。不同平台有自己的特性,不同平台用户也有自己的操作习惯,如果你想讨好所有人,也就意味着你无法讨好任何人。

 

4.减少开发工作量或者让开发变得更简单?

 

对老板来说,这是一个非常诱人话题,因为工作量的减少就意味着节省更多的钱,没有老板不喜欢用更少的钱办更多的事。而且目前一个非常大的问题是,移动设备开发人员特别是iOS开发人员非常不好找,因为技术好的都自己做应用了,人家自己也能赚个月薪上万甚至更多,为什么要进你的公司?怎么说也是自己的事业,拥有无限可能,还可以充分享受自由。但如果可以充分利用HTML5,那么我们就可以招聘Web前端的开发人员来构建移动应用,这样就不愁招人的有问题。因为在许多人的眼里,HTML5/CSS/Javascript都是没多大技术含量的东西,实在找不到人,找些实习生学学也就会了。

 

但问题是,工作量真的会减少吗?技术门槛真的那么低么?答案是NO

 

我曾经花了半年的时间去开发一个基于HTML5的移动框架,用来模拟Native应用,让HTML5应用看起来尽可能看起来像本地应用,注意:是像。这有点像jTouch,但不一样的是,它能和Native程序很好地交互,并且能调用本地资源等等特性。但最后结果确不是那么令人满意,比如 HTML5在动画切换的时候,有时候候会有一些莫名其妙的问题,当然你可以告诉我把动画效果关了,但这看起来很死板,最后我不得不关闭某些动画。而用Objective-c编写程序就没这么多事了,几句简单的代码可以实现很酷的动画,用HTML5需要更多的代码,甚至根本无法实现。

 

而且移动设备上的HTML5开发对开发人员的技术有非常高的要求,不是一般的Web前端人员能解决的,通常拥有这样技术的人才,工资水平也不会比Native开发人员低多少。如果你仅仅是要开发一个移动设备上的网站,这会简单很多,但如果你希望模拟Native应用,并且拥有较高的效率和优雅的用户体验,这就很有技术含量了。不要小看Javascript这类Web开发语言,通常我的看法是越简单的语言越会体现出技术人员的水平,特别是规划设计能力。

 

5.其它问题,资源调用的限制,比如说在iOS中有Javascript运行不能超过15秒的限制,不能调用本地硬件设备(如相机等),无法使用推送服务等。

如何选择?

 

是否这样,我们就不要选择HTML5了呢?我在前面说过:“要根据企业自身的情况、团队的构成、公司的战略以及产品的特点来综合选择”,我最近在关于HTML5讨论的微博上也有谈到:“HTML5是战略性方向,FacebookGoogle已经布局,Google MobileiPhone上的体验可以媲美Native。基本上Native+Web App可以秒杀多数应用,如果不愿意受制于各种Store,单独的Web App也是一个不错的方向。对于游戏类和对硬件环境依赖严重的应用,只能是是Native”,相关链接:摘录微博——对移动互联网的一些看法。仅管有这样那样的问题,但HTML5是一种趋势,在未来三至五年,HTML5将会取代很多本地应用,但就像多年前我们一直在谈B/S架构取代C/S架构一样,这需要一个过程。

 

通常在HTMLNative之间,我们有三种选择——HTML5Native App以及HTML5+NativeHTML5就是指纯Web的移动应用,用户需要打开浏览器,然后输入应用的网址访问。Native指的是基于特定平台开发的应用。Native+HTML5实际上是一种加壳的方式,将HTML5用和浏览器封装起来,但这对用户是不可见的,用户没有任何异物感,和Store上下载的App没有什么两样。

 

就我个人而言,我是比较推崇HTML5+Native的,这种加壳的方式,可以让你享受NativeHTML5的双重好处,但缺点是对技术含量要求较高。当然我这里指的不是简单地把HTML5封装到一个浏览器里面,NativeHTML5会有许多的交互,实际上这有点像混合硬盘,我们即便享受 SSD的快速,但我们又想获得机械硬盘的高性价比。我认为在5-10年内,这都会是一种不错的解决方案,当HTML5和硬件发展到一定水平之后,我们再完全转向HTML5成本也会非常低的。

 

如何做?

 

假定现有一个对本地环境依赖不那么严重的项目,如微博客户端,各种社交美食甚至LBS应用,我们都可以采用HTML5+Native。如图所示,我们可以将核心的代码Core层用封装起来,这个代码和平台无关,主要是业务逻辑以及和Shell的交互,代码用Web语言编写。在Core层上我们再根据不同的移动平台制作不同的UI。最后我们将上述两层放到各平台的Shell中,这个Shell主要是由浏览器来完成工作,当然还包括一些硬件操作和读取本地资源,如GPS、重力感应、相机调用、地图、推送通知或者IAP等。

 

 

 

我们可以把Web的升级部分部署到服务器上,用户运行App后,App会向服务器讲求获取最新的Web程序并下载运行,这样可以达到跳过各种 Store的更新审核,达到快速更新的目的。而且假如用户无法访问互联网,我们可以让用户使用上一个版本的程序,不会像纯Web App那样要求用户一定要联网。

 

好处

 

1.用户可以离线使用

 

2.更新下载量及少,可以全部更新,也可以选择替换部分文件

 

3.代码很安全安全,众所周知Web应用有一个很大的问题就是代码安全的问题,但现在我们可以将Web代码全部加密,本地应用解密后再运行,大大的提供了代码的安全性。

 

4.可以通过浏览器作为中介充分利用Native的好处,比如说可以使用GPS、照相机、本地相册、读取本地联系人,也可以使用推送功能等,最重要的是,某些Web无法实现的功能,我们可以利用Native来实现。

 

5.跨平台,多数核心代码不用重写,Javascript的代码用得好的话,在许多地方都可以用到,包括移动应用、移动网站、PC网站、各种浏览器插件,甚至可以用WebKit封装作为跨平台的应用程序。诚然,这种方式并非完全跨平台,但这样也足以减少很多工作量了,特别是后期的维护。而且完全的跨平台是没有意义的,不同平台有自己的风格,为了更好的用户体验,界面层还是需要针对性开发的。

 

坏处

 

我觉得最大的坏处是技术难度高,如果仅仅是简单的浏览器封装几个HTML文件,那没什么技术难度,但如果要打造一个系统级的东西,这就很有技术难度了。这要求有人要了解三个主流平台的浏览器特性,通晓Native程序的开发,要精通HTML5/CSS3/Javascript,最重要的是,要有较强的架构设计能力。

 

如果要再找一个坏处的话,就是它不能满足所有的需要,它并不能代替Native,但我认为他可以替代大部的Native

适合我们吗?

 

首先从产品的角度考虑,你的产品是否严重依赖于本地环境,比如说图像处理和华丽的游戏之类的。第二要考虑的是你的技术团队的构成,如果你们的团队有一个能解决这些问题的牛人,并且有一些清通Web前端的人,那我觉得你可以考虑用这种方式。技术选型非常重要,稍有不慎,后患无穷。第三个要考虑你们公司的战略,对HTML5未来发展的看法,愿意在移动互联网上付出多少代价,是否愿意做前瞻性的事,是否愿意在前期投入较多的资源,是否允许试错等等。

 

源文档 <http://cnbeta.com/articles/173420.htm

posted @ 2012-02-22 22:18 寻得乐中乐 阅读(26) 评论(0) 编辑

2011年12月22日 #

天天看白色的VS背景有已经厌倦不?显示器显示白色是因为监视器上面的三原色全部点亮,时间长了不仅刺眼而且还费电,听说显示器的寿命也会降低!

现在是环保时代,都讲究个绿色,咱能黑就黑,省电还不就是省钱么,再说了,一名真正的黑客,你得用黑的屏幕!

感觉如何?

想要你就说出来,咱给你就是,来吧:http://www.xiaozhou.net/attachments/month_0907/q2009713213241.rar

里面的dark.vssettings便是,导入到VS中,就可以看到效果喽...试了几个其它的配色效果,还是喜欢黑的...

如果你对配色方案很感兴趣,可以看一下这个网站http://studiostyl.es/

本文参考自:http://www.xiaozhou.net/ittech/software/visual-studio-ide-color-scheme-2009-07-13.htm

posted @ 2011-12-22 03:26 寻得乐中乐 阅读(446) 评论(1) 编辑

2011年12月20日 #

摘要: 如何测试异常呢?实例验证如下:检测除数为0的异常,先写一个除的方法:然后再写其测试:结果Failture,因为除数并不是0,检测到有异常才是正确的,所以修改一下程序:将pro.divide(1,1)改成pro.divide(1,0)这一次成功测试到了异常!阅读全文
posted @ 2011-12-20 11:34 寻得乐中乐 阅读(44) 评论(0) 编辑

摘要: 最近写小程序,需要用到测试,网上翻了下,找到一篇每个开发人员现在应该下载的十种必备工具,里面说到Nunit,尝试在VS2010的扩展管理器/联机库中查找,还行,里面还真有,下载并安装在哪儿找到这个小扩展呢?点击视图/其他窗口/Visual Nunit可以打开.问题是这个东西怎么用呢?他需要Nunit的支持,在此下载.安装完毕NUnit后新建一个项目来玩玩:按NUnit的要求在主程序中写一个简单的加法,再写上其测试的代码,1.在类名的前面加上TestFixture,表明这是一个用来测试的类2.在方法前面加上Test,表明这是一个用来测试的方法3.NUnit里面最常用的一个静态方法Assert.A阅读全文
posted @ 2011-12-20 11:18 寻得乐中乐 阅读(200) 评论(0) 编辑

2011年12月11日 #

摘要: 近日做一个小应用程序,用到了SQLite,顺便就尝试了下.NET 4的Entity Framework。按照以前在.NET 3.5下的方法一阵捣鼓,配置好了SQLite,并成功生成了Model。F5,调试运行下,出现异常,以前从来没有见到过的异常。“混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。”Google下,居然没有一条相关信息,估计是我用的中文版的原因。。。。。于是,就到System.Data.SQLite淘淘解决办法,忽见一 帖,提到在app.config配置当中的startup节点一个属性,useLeg阅读全文
posted @ 2011-12-11 23:57 寻得乐中乐 阅读(91) 评论(0) 编辑

摘要: 今天在练习ado.net实体数据模型的时候很不幸的遇到了一个BUG,不管我如何的调整,在SaveChanges的时候总是提示更新条目时出错,详细信息里面说不能将值NULL插入列"ID",如下图:可是把老师的代码复制过来以后发现一点儿问题也没有,开始以为是保存guid出的问题,单独创建了一个只使用guid的项目,还是出问题,没办法,只好在老师的代码上精简一下,只剩下一个ID我的项目也只保留一个ID属性,开始比较edmx文件,结果发现差别就在这个StoreGeneratePattern不同,在VS里面修改后结果发现无论我怎么改,这儿就是不变化,可是编辑器里面明明有变化啊,上网一阅读全文
posted @ 2011-12-11 10:04 寻得乐中乐 阅读(240) 评论(0) 编辑

2011年12月3日 #

摘要: 给大家转一篇http协议的文章,对我等网络分析点新手还是很有帮助的。 原帖地址:http://www.csna.cn/viewthread.php?tid=371 一、目的 学习网络分析也有段时间了,到现在也算是逐渐入门了吧,想想自己以前刚接触时,不知道从何入手。学习网络分析,肯定要从协议入手,如果只看相关资料,这样 印象不深刻,而且也没什么实战的经验,速度和效率都慢了很多。后来有高人指点了我,用网络分析软件来学习协议比较好,从此我开始了另外一种方法的学习。呵 呵,自己作为一个初学者,想把自己学习的方法写出来,和大家交流交流,个人认为方法是最重要的。 TCP/IP协议族里的协议太多了,这个还.阅读全文
posted @ 2011-12-03 04:46 寻得乐中乐 阅读(44) 评论(0) 编辑

仅列出标题  下一页