15
11

早上收到Xamarin的邮件,他们在纽约时间2013年11月13日上午宣布Xamarin将加入到VS2013(而且肯定是内置),让开发者使用C#语言高效开发优雅的ios和android的应用,届时还将给MSDN的订阅者们提供相关专题内容,太棒了!

这是mono老大Miguel de Icaza(米格尔·德伊卡萨)http://t.cn/8Dkw4qt 在twitter上的留言,他认为今天对于C#和F#是一个伟大的日子,估计Xamarin这两年过来的艰辛只有他们团队自己知道。

1

 

最后,恭喜Xamarin,恭喜Mono老大,这将是写入C#发展史的一件大事。

02
11

Google是我最喜欢的公司之一,最开始入手android手机的时候(2010年)就考虑过google的nexus系列,但是当时对海淘、转运都不了解,加上国内市场的水货价格不菲、质量不敢保证,一直没有购买。

这段时间我用了一年多的小米1代频繁重启,小米客服又不搭理人,检修就要收费,作为第一代“米粉”(当年第一批机子的人),深受打击,并立志对于这类型的产品,坚决购买进口。

前些日子就考虑入手nexus 5,做了一些准备,比如但没有做充足,而且这两天自己的客户端产品要发布,根本没有时间留意nexus 5发布时间。早应该想到google会在万圣节的时候发布手机的。不过没有关系,反正我也不着急使用。

11月1日,因为没有做好准备,所以还有些纠结,幸亏之前对转运公司做了一些调查,赶紧在风雷注册了一个帐号,这里有一个链接地址,注册可以送20块钱,点击注册,记得不要把推荐人id去掉,否则不会送,我就因为这样所以没有送20块钱,后悔啊...第一次从米国转运,希望风雷不要掉链子...

11月2日,在google play上下单购买,用master的信用卡,下单过程木有任何问题,google显示要3到4周发货;

11月3日...

等等等...

11月11日,双11晚上,信用卡通知有消费,看金额是google,第一反应是google发货了,赶紧爬起来查看订单状态,发现还是“待处理”;

11月12日,上午来到公司后,收到email,google已经发货,正在送往--美国俄勒冈免税州,太棒了,看来这次google不缺货;

1

 

11月13日,货物已经从肯塔基州发出;

2

 

11月14日...

11月15日,上午到Spokane, WA, United States了,离目的地很近了

1

11月15日,下午到达俄勒冈,希望早点到CA发货

ups

 

11月16日...

等等等

11月24日上午9点,在去石景山的公交车上,我连接中移动的wifi,收到风雷的邮件已入库,待发货,爽!看来从俄勒冈到加利福尼亚确实需要5个工作日啊!另外,风雷确实按1.3磅算了!只能说:这是他们的生存之道-_-

11月25日,问风雷客服,说今天能发货。

11月26日上午9点,收到风雷的邮件:已发货!希望快点,本周就到达北京啊!!!

1

 

11月27日,等...

11月28日,感恩节,我开始怀疑美国那边是不是快递放假了?

11月29日,还是没有看到更新...

11月30日,上午看到已经到达北京,正在清关,usps确实快啊!

1

12月2日,查看ems跟踪快递,已经送达北京海关处理中心,希望赶紧处理好让我去拿吧,反正基本会税-_-

1

 

12月3日,上午查看ems,昨天下班的时候已经到达双榆树,午饭前立马赶过去取,如当初所预料,纳税200元,“税税”平安-_-

1

 

回到家,激动地开箱,确实非常激动!google是我最爱的公司,木有之一,“鸡婆”一下我的开箱照,嘿嘿~

step1:这个是风雷做了包裹处理了,外加一个盒子,就多了0.2磅-_-

_-5

 

step2:打开,看到google寄往俄勒冈的信息

1

step3:看到google字样很兴奋!这是账单。

_-3

step4:特写一下,用了google那么多年的网上服务,这是第一次拿到google的实体物品,happy

_-2

step5:最后来一张合影

_-1

 

海淘是一项冒险,等待的过程很好玩,拿到货的那一刻很high!

 

 

08
10

[转]如何在github上传自己的代码

0
归档:2013年10月分类:LAMP开发

注册GitHub后你就会有0.3G的免费空间,不过只能创建公开项目,这也满足代码分享的目的,我最喜欢的倒是它的代码展示方式,可以直接浏览你的代码,代码是经过高亮、添加行号处理过的,十分漂亮,体验一流,比如这个Webpy托管的地方。而作为想要了解你代码的人,可以选择直接在线浏览自己感兴趣的,也可以直接下载压缩包,或者直接使用Git clone到本地。

因为GitHub是基于Git版本控制系统,所以你上传修改代码什么的,都需要使用Git工具。我这里主要是用来分享和展示代码,所以不想在版本控制方面做过多的阐述,下面就简单讲解一下怎么在GitHub上新建一个项目,还有把自己的代码传上去。下面的前提是你已经注册了GitHub和下载安装了Git——Git下载Windows版本下载

上传分享代码

1.在GitHub上建立项目

登录GitHub后,你可以在右边靠中那里找到一个按钮“New Repository”,点击过后,填入项目名称、说明和网址过后就可以创建了,然后会出现一个提示页面,记下类似[email protected]:XXX/XXX.git的地址,这个就是你这个项目的地址了。

2.配置Git以及上传代码

安装Git成功后,如果是Windows下,选择Git Bash,在命令行中完成一切,可能开始有点麻烦,不过就那几条命令行,用几次就记住啦。首先初始设置Git:

1 git config --global user.name "Your Real Name"
2 git config --global user.email [email protected]

然后开始进行最麻烦的一步了,你需要上传文件到GitHub的Git系统上,得需要一个SSH密匙来认证,下面就开始生成密钥和提交密钥。打开Git Bash,创建SSH key:

1 ssh-keygen -C '[email protected]' -t rsa

然后要你输入SSH密匙的存放位置,可以不管,直接回车使用默认路径。再输入你想要的密码,SSH key就生成了。现在你需要将这个Key提交到GitHub,首先打开Key保存的位置,里面会有三个文件,找到id_rsa.pub,用文本编辑器打开,复制里面的全部字符。到GitHub,在右上方工具栏里找到Account Settings。在这个页面上有一个SSH Public Keys标签,选择Add another public key。Title可以随便填一个,Key就粘贴刚才的字符,提交。

完成这些工作后,就可以上传自己的代码了。找到自己要分享上传的代码文件夹,右击选择Git Bash,或者在Git Bash中进入这个文件夹。建立一个仓库:

1 git init

选择要添加进仓库的文件:

1 git add .

一般如果你想分享这个文件夹里的所有代码,就在 add后面加“.”,上面的例子就是这样,如果传指定的,只需要把“.”改为文件名即可,现在只是选择了要加入仓库的文件,下面才是添加进入仓库:

1 git commit -m 'Test'

-m后面跟一个参数,表示说明,将代码提交到GitHub后,将会在代码文件信息上显示这个说明,如下图标记的地方。

搞了这么久,现在才开始把本地仓库上传到GitHub了,下面两行命令搞定问题:

1    
2 git remote add origin [email protected]:XXX/XXX.git
3 git push -u origin master

这个[email protected]:XXX/XXX.git就是上面创建项目是生成的地址。现在打开你的项目网址,你就可以发现你的代码已经展示出来了。如果你要更新代码的话,就重复上面的吧。

如果提交了敏感信息,比如代码中设置的自己的密码什么的忘删除就上传上去了怎么办?重新修改过后上传依然有历史记录,而使用Git删除历史记录貌似很麻烦,于是就采用删除项目吧,删除了再重新上传。删除项目需要在GitHub网站上右上方找到admin按钮,进去后右边最下面有个删除的按钮,这样就可以删除了。

一些可能遇到的问题解决:

如果输入$ git remote add origin [email protected]:djqiang(github帐号名)/gitdemo(项目名).git

提示出错信息:fatal: remote origin already exists.

解决办法如下:

1、先输入$ git remote rm origin

2、再输入$ git remote add origin [email protected]:djqiang/gitdemo.git 就不会报错了!

3、如果输入$ git remote rm origin 还是报错的话,error: Could not remove config section 'remote.origin'. 我们需要修改gitconfig文件的内容

4、找到你的github的安装路径,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4aea0e4ae9fcd3358bd96720bb5c8\etc

5、找到一个名为gitconfig的文件,打开它把里面的[remote "origin"]那一行删掉就好了!

如果输入$ ssh -T [email protected]
出现错误提示:Permission denied (publickey).因为新生成的key不能加入ssh就会导致连接不上github。

解决办法如下:

1、先输入$ ssh-agent,再输入$ ssh-add ~/.ssh/id_key,这样就可以了。

2、如果还是不行的话,输入ssh-add ~/.ssh/id_key 命令后出现报错Could not open a connection to your authentication agent.解决方法是key用Git Gui的ssh工具生成,这样生成的时候key就直接保存在ssh中了,不需要再ssh-add命令加入了,其它的user,token等配置都用命令行来做。

3、最好检查一下在你复制id_rsa.pub文件的内容时有没有产生多余的空格或空行,有些编辑器会帮你添加这些的。

如果输入$ git push origin master

提示出错信息:error:failed to push som refs to .......

解决办法如下:

1、先输入$ git pull origin master //先把远程服务器github上面的文件拉下来

2、再输入$ git push origin master

3、如果出现报错 fatal: Couldn't find remote ref master或者fatal: 'origin' does not appear to be a git repository以及fatal: Could not read from remote repository.

4、则需要重新输入$ git remote add origin[email protected]:djqiang/gitdemo.git

使用git在本地创建一个项目的过程

$ makdir ~/hello-world    //创建一个项目hello-world
$ cd ~/hello-world       //打开这个项目
$ git init             //初始化
$ touch README
$ git add README        //更新README文件
$ git commit -m 'first commit'     //提交更新,并注释信息“first commit”
$ git remote add origin [email protected]:defnngj/hello-world.git     //连接远程github项目
$ git push -u origin master     //将本地项目更新到github项目上去

18
8

今年7月12日我们在北京购房了一套商品房,做为北漂一族,而且大部分资金靠自己打工所得,所以资金并不是非常充裕。如果期间懂得门道的话,或者可以早点下手买房。现在把经验贴出来,如果有缘人看到,希望能从中得到帮助。

1、首付款:如果购买的是商品房,那么首付多少你就得准备多少首付款;如果是保障房,你可以用公积金充当首付。目前北京市实行限购,所以交完定金(定金可以充当首付款)后,建委那边需要进行长达至少15个工作日的审核。交首付的时间一般是在交完定金后的1个月左右。

2、购房合同:购房合同是交首付的时候签的,一式四份,但如果你是贷款购房,在你没有换完房贷之前,你是拿不到合同的(抵押在银行)。一般来说,签订合同后,在两周内应该是可以拿到合同的,如果你着急要购房合同就去催开发商(这个会关系到你取公积金的时间,特别是那些刷信用卡付首付的人)。

3、提取公积金:北京提取公积金相对来说还是比较方便的。如果是商业贷款,那么可以在拿到首付款发票(交完首付就可以拿到)和购房合同后,就可以去办理提取,周一到周五都可以办理,办理后3到5个工作日内基本就到了(这里注意了:如果着急提取还信用卡,那么就催人事去办理,拿到合同就催他们去办理,如果不催,他们每个月都是20号左右才去公积金处);如果是公积金贷款,那只能是在办理完公积金贷款后提取了。

关于商业贷款是可以用首付款发票和购房合同提取公积金的,公积金电话咨询中心可能会告诉你不行,但是我确认目前肯定是可以的,这里还有一篇文章是专门报道这个问题的。

4、贷款:如果贷款额度超过住房公积金贷款上限,并且银行可以打85折甚至更低,建议走纯商业贷款,这样会省很多心;如果低于上限,当然可以走住房公积金贷款。另外,开发商会说贷款不下来收违约金,其实这个倒不是大问题,目前来看没有发现收违约金的。

通过这几点的分析,如果公积金足够多,在做了精打细算后,完全可以刷信用卡付首付(金额不要超过公积金),买完房子后立刻提取公积金还信用卡。当然,最坏情况也是信用卡分期,第二个月全部偿还。

09
8

这是我们团队内部关于Mono for android讲座的ppt,写得一般,不过能点出一些开发过程中的要害。

下载地址:基于Mono for android移动开发

mono for android移动开发

08
8

一、简介

在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆。我想下面的代码能证实这点。下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不仅被编译,并都获得正确答案,且他们的结果一样。如果你对此感到困惑,那么请继续看这篇文章。

class Customer
{
    public int ID { get; set; }
    public static bool Test(Customer x)
    {
        return x.ID == 5;
    }
}
...
List<Customer> custs = new List<Customer>();
custs.Add(new Customer() { ID = 1 });
custs.Add(new Customer() { ID = 5 });
 
custs.First(new Func<Customer, bool>(delegate(Customer x) { return x.ID == 5; }));
custs.First(new Func<Customer, bool>((Customer x) => x.ID == 5));
custs.First(delegate(Customer x) { return x.ID == 5; });
custs.First((Customer x) => x.ID == 5);
custs.First(x => x.ID == 5);
custs.First(Customer.Test);

二、什么是委托?

现在你定义一个处理用户订单的购物车ShoppingCart类。管理层决定根据数量,价格等给客人折扣。做为其中的一部分,他们已经实现了处理订单时你要考虑一方面。不用考虑过多,你简单声明一个变量来保存有“吸引力的折扣”(magicDisCount),然后实现逻辑。

class Program {
    static void Main(string[] args)  {
        new ShoppingCart().Process();
    }
class ShoppingCart {
    public void Process() {
        int magicDiscount = 5;
        // ...
    }
}

第二天,异想天开的管理层决定根据购买时间调整折扣。这个很简单,但需要你改动一点代码。

class ShoppingCart {
    public void Process() {
        int magicDiscount = 5;
        if (DateTime.Now.Hour < 12) {
            magicDiscount = 10;
        }
    }
}

接下来一段时间里,管理层又反复添加更多的折扣逻辑。这时你就会在心理抱怨“受够了”。那么我该怎么做才能把这些无聊的逻辑从我的代码中剥离出去,让该处理的人去处理呢?这时你要做的是移交或者委派给相应职能的别人。幸运的是,.NET为此提供了一种叫做“委托”的机制。

三、委托

如果你有C/C++编程背景,描述委托最好的方法是“函数指针”。对所有人来说,可以认为把委托传递给方法与把值或对象传递给方法一样。比如下面三行代码就表现出一样的基本原则:你在传递数据给Process处理而不是你自己使用。

 
// 给方法Process传递一个整形值
Process( 5 );
// 给方法Process传递一个ArrayList的引用
Process( new ArrayList() );
// 给方法Process传递一个方法的引用
Process( discountDelegate );

DiscountDelegate是什么?我如何创建?Process方法如何使用?首先如同声明一个类一样,声明一个委托类型。

delegate int DiscountDelegate();
  这句话的意思是我们有一个叫DiscountDelegate的委托类型,我们可以像使用类,结构体等一样使用它。它不需要数据参数,但返回一个整数值。像类一样,我们必须创建一个它的实例它才有意义。记住,创建一个委托实例实质上是创建一个方法的引用。创建实例时关键是要明白DiscountDelegate没有任何构造器,它有一个隐式的构造函数来构造一个与它相同签名的方法(没有传入参数,返回一个整数)。那你怎么给这个构造函数一个方法呢?.NET向你提供了一个向它名字一样简单的方法,你所做的只是忽略圆括号。
1
DiscountDelegate discount = new DiscountDelegate(class.method);
  在深入之前,先回到开始的例子,整理一个代码。我们会添加一个Calculator类来帮助我们处理折扣逻辑,并给我们的委托提供一些方法。
delegate int DiscountDelegate();
 
class Program {
    static void Main(string[] args) {
        Calculator calc = new Calculator();
        DiscountDelegate discount = null;
        if (DateTime.Now.Hour < 12) {
            discount = new DiscountDelegate(calc.Morning);
        }
        else if (DateTime.Now.Hour < 20) {
            discount = new DiscountDelegate(calc.Afternoon);
        }
        else {
            discount = new DiscountDelegate(calc.Night);
        }
        new ShoppingCart().Process(discount);
    }
class Calculator {
    public int Morning() {
        return 5;
    }
    public int Afternoon() {
        return 10;
    }
    public int Night() {
        return 15;
    }
class ShoppingCart {
    public void Process(DiscountDelegate discount) {
        int magicDiscount = discount();
        // ...
    }
}

正如你所见,在Calculator类中,我们为每个逻辑分支创建了一个方法。在Main方法中,我们创建一个Calculator实例和一个DiscountDelegate实例,并按照我们所期望的把它们整合在一起。

太棒了,我们不用担心Process方法中的逻辑了,我们只需要简单得回调我们定义的委托。记住!我们不关心委托是如何创建的(或什么时间),我们就像调用其他方法一样调用它。如你所见,另一种理解委托的方法是,它延迟执行一个方法。Calculator方法在过去某个时间本选择,但不会执行,直到我们调用discount()的时候。现在看看我们的解决方案,这里仍然存在一些丑陋的代码。在Calculator类中,我们可以用一个不同的方法来返回替代每个有返回值得方法吗?答案是肯定的,让我们把这些乱糟糟的代码合并起来。

 
delegate int DiscountDelegate();
 
class Program {
    static void Main(string[] args) {
        new ShoppingCart().Process(new DiscountDelegate(Calculator.Calculate));
    }
class Calculator {
    public static int Calculate() {
        int discount = 0;
        if (DateTime.Now.Hour < 12) {
            discount = 5;
        }
        else if (DateTime.Now.Hour < 20) {
            discount = 10;
        }
        else {
            discount = 15;
        }
        return discount;
    }
class ShoppingCart {
    public void Process(DiscountDelegate discount) {
        int magicDiscount = discount();
         // ...
    }
}

这样子看起来更好点。你会注意到我们用一个静态的Calculate方法替换了所有原来的方法,在Main方法中也不用费心维护一个指向DiscountDelegate的引用。现在你明白了所有关于委托的东西了吗?在2004年.NET1.1中可以这么说,但是很不幸的是,这种框架自那以后更加成熟了。

四、灯光,镜头,开始 或者我们需要Func!

微软在.NET 2.0中引入了泛型,并提供了一个泛型委托:Action<T>。老实说,我认为它远不够用。后来在.NET 3.5中,它为我们提供了一些我们不想定义的通用委托。他们扩展了Action,并添加了Func,二者唯一区别在于Func型方法有一个返回值而Action型方法没有。

这意味着我们不需要声明自己的DiscountDelegate,可以用Func<int>替代。为说明这些观点是如何工作的,我们来假设管理层又一次改变了我们的逻辑,我们需要提供一些特殊的折扣。很简单,我们将给Calculate方法传入一个bool型值。

现在我们的委托签名变成Func<bool,int>。注意Calculate方法现在包含一个bool型参数,我们用一个bool值调用discount()。

class Program {
    static void Main(string[] args) {
        new ShoppingCart().Process(new Func<bool, int>(Calculator.Calculate));
    }
}
 
class Calculator {
    public static int Calculate(bool special) {
        int discount = 0;
        if (DateTime.Now.Hour < 12) {
            discount = 5;
        }
        else if (DateTime.Now.Hour < 20) {
            discount = 10;
        }
        else if (special) {
            discount = 20;
        }
        else {
            discount = 15;
        }
        return discount;
    }
}
 
class ShoppingCart {
    public void Process(Func<bool,int> discount) {
        int magicDiscount = discount(false);
        int magicDiscount2 = discount(true);
    }
}

好像还算不错,我们又省了一行代码,这样算结束了吗?当然没有,我们甚至能省掉类型判断。只要我们传递的方法有严格签名的委托,.NET允许我们完全忽略掉显式创建Func<bool,int>。

//因为Process期望的方法有一个bool型输入参数和返回一个int值,所以下面这句话是正确的
new ShoppingCart().Process(Calculator.Calculate);

至此,首先通过忽略自定义委托,我们省略了代码;然后排出了明确的创建Func委托。我们能继续压缩代码行吗?到此我们才完成此文的一半,答案显然是“能”。

 五、匿名方法

匿名方法能够让你声明一个方法体而不需要给它指定一个名字。在接下来的场景里,它们以一个“普通的”方法存在;但是在你的代码中没有任何方法显式调用它。匿名方法只能在使用委托的时候创建,事实上,它们通过delegate关键字创建。

class Program {
    static void Main(string[] args)     {
        new ShoppingCart().Process(
            new Func<bool, int>(delegate(bool x) { return x ? 10 : 5; }
        ));
    }
}

正如你所见,我们完全删除了Calculator类的需求。你可以在打括号中添加任何其他方法中的逻辑。如果你在看它如何执行时有困难,那就把delegate(bool x)做为一个方法签名,而不是一个关键字。设想这段代码在一个类里,delegate(bool x){return 5;}是一个完整的合法方法声明(我们确实有一个返回值),恰好delegate是一个保留字,在这里,它让这个方法匿名。

至此,我确信现在你知道这里我们甚至能压缩更多的代码。顺利成章的,我们能忽略显式声明Func委托的需要;.NET让我们使用delegate关键字更方便。

class Program {
    static void Main(string[] args) {
        new ShoppingCart().Process(
          delegate(bool x) { return x ? 10 : 5; }
        );
    }
}

当把.NET方法做为委托参数时或处理时间时,就能看到匿名方法的真正用处。之前,你会为你所关注的所有可能行为创建了一个方法,现在你仅需以内联的方式创建它们,并可以避免污染你的命名空间。

// 创建一个匿名比对方法
custs.Sort(delegate(Customer c1, Customer c2) {
    return Comparer<int>.Default.Compare(c1.ID, c2.ID);
});
 
//  创建一个匿名事件
button1.Click += delegate(object o, EventArgs e) { MessageBox.Show("Click!"); };

六、Lambda 表达式

MSDN中写道:“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。你应当明白“用户创建委托”部分,但什么是“表达式”呢?老实说,表达式和表达式树不在此为讨论范围内。现在我们唯一需要明白的是,表达式是.NET程序运行时表示数据或对象的代码(C#代码)。引用Jon Skeet的话:“表达式树是一种表达逻辑,这样其他的代码可以查询的方法。当一个lambda表达式转换成一个表达式树,编译器不会发出了lambda表达式的白细胞介素,它会发出白细胞介素这将会建立一个表达式树表示相同的逻辑。”

我们需要关注的是Lambda表达式替换匿名方法,和其他的特性。回顾我们最后例子,我们已经在一行代码里压缩了处理整个折扣算法的逻辑。

class Program {
    static void Main(string[] args) {
        new ShoppingCart().Process(
            delegate(bool x) { return x ? 10 : 5; }
        );
    }
}

你相信我们能让这个更短吗?Lambda表达式用'=>'运算符表明什么参数传递给表达式。编译器进一步处理,允许我们忽略类型并自动替我们推断这些类型。如果你有2个或更多个参数,你需要用圆括号:(x,y)=>。如果只有一个,你设置不需要这样:x=>。

static void Main(string[] args) {
    Func<bool, int> del = x => x ? 10 : 5;
    new ShoppingCart().Process(del);
}
// 更短啦...
static void Main(string[] args) {
    new ShoppingCart().Process(x => x ? 10 : 5);
}

就是这样子。x被推断为bool型,并且有返回值,因为Process接收一个Func<bool,int>。如果我们想实现像之前那样的完整代码块,我们只需要加上大括号。

static void Main(string[] args) {
    new ShoppingCart().Process(  x => {
        int discount = 0;
        if (DateTime.Now.Hour < 12) {
            discount = 5;
        }
        else if (DateTime.Now.Hour < 20) {
            discount = 10;
        }
        else if(x)  {
            discount = 20;
        }
        else {
             discount = 15;
        }
        return discount;
    });
}

七、写在最后

使用与不使用大括号有一个重要的不同。当你用时,你创建一个“语句Lambda”,反之,它是"表达Lambda"。语句Lambda能执行多条语句(因此需要大括号),但不能创建表达树。你可能只在使用IQueryable接口是遇到这个问题。下面的例子说明这个问题。

List<string> list = new List<string>();
IQueryable<string> query = list.AsQueryable();
list.Add("one");
list.Add("two");
list.Add("three");
 
string foo = list.First(x => x.EndsWith("o"));
string bar = query.First(x => x.EndsWith("o"));
// foo and bar are now both 'two' as expected
foo = list.First(x => { return x.EndsWith("e"); }); //no error
bar = query.First(x => { return x.EndsWith("e"); }); //error
bar = query.First((Func<string,bool>)(x => { return x.EndsWith("e"); })); //no error

倒数第二行在编译时失败。这是因为IQueryable.First期望得到一个表达式作为参数,然而List<T>.First期望得到一个委托。你可以按照最后一行强制转换Lambda到一个委托(使用First的方法重载)。

这里很难结束讨论,但是我觉得必须停止。Lambda大体上分为两类:一类创建匿名方法和委托;另一类创建表达式。表达式自成一体,并不是.NET开发者的必备知识(无疑在LINQ中已有实现)。

 

        此文为CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>

08
8

.NET Framework发展简历

0
归档:2013年8月分类:C#和.NET

.NET Framework1.0版本是在2002年正式发布的,当时获得了世界软件界的极大瞩目,影响深远,比尔盖茨说这是为未来10年的战略做准备,现在看来,微软的这个产品获得了巨大成功。

2005年,微软发布了.NET Framework2.0,这个版本是迄今为止最重要的一个版本,2.0为C#引入了范型和公共语言运行时。.NET 3.0版本是基于2.0的运行时的,引入了WPF和XAML语言,还有一项伟大的技术WCF。.NET3.5则引入了C#3.0,并且支持LINQ语言(一种全新的方式来检索数据)和Lambda表达式。.NET4.0是继2.0之后的一个重要版本,引入了动态语言和并行编程。

.NET Framework4.5是基于4.0版本的更新,主要有下面这些更新:

1、异步变成方式,在C#5.0中,异步编程变得更加简单;

2、引入了Windows Store Apps;

3、增强了数据访问方式,主要是Entity Framework5.0的发布;

4、增强了WPF和江MVC升级到了4.0;

08
8

Mono for android获取网络状态

0
归档:2013年8月分类:开源Mono

app应用的一个重要功能就是连接到互联网,而连接互联网可以有很多中方式,2G、3G、wifi等方法,有时候是没有网络的,所以在开发应用的时候,需要判断网络状态。

mono for android提供了比较简便的方法来获取网络状态,代码如下:

/// <summary>
/// 获取网络状态
/// </summary>
/// <returns><c>true</c>, if net work was checked, <c>false</c> otherwise.</returns>
/// <param name="context">Context.</param>

public static bool CheckNetWork(Context context)
{
var connectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
if(connectivityManager.ActiveNetworkInfo!=null)
{
NetworkInfo.State netWorkState=connectivityManager.ActiveNetworkInfo.GetState();
if(netWorkState==NetworkInfo.State.Connected)
{
return true;
}
}
return false;
}

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。