[C#]C# 3.0将偷懒进行到底

baacloud免费翻墙vpn注册使用

C# 3.0将偷懒进行到底

本文为博客园zpino原创

http://www.cnblogs.com/zpino/ 转载请说明出处!

 

最近在MS中了解到了一些东西。首先我要说,我绝对是一个新手。

要说核心原理,俺最多能给你搬来一点,要是刨根问底的话,去找MSDN。

 

隐藏类型局部变量

这个很多人都知道(–!我现在才知道。貌似很受打击,有点孤陋寡闻)

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var a = 1;  //自动判断类型。编译后成为int类型
            var b = 2;   //更加右边的值 推断左边的类型
            var c = 0;
if (b > a)
{
c = 4;
}
else
{
c = 5;
}
Console.WriteLine(c);
}
}
}

 

注意:

1 var 不是一个类型。顶多就像一个占位的东西。编译后替换成int string等等.而且只能作为局部变量!

2 var的值不能为null。不然编译器不能推断。

3 不能为对象和集合的初始化。但是可以初始化数组,包括多维数组。 var q=new{1,2,3};

初始化语句

 

 

扩展方法

这个也是一个很方便的东西

可以扩展一个类的方法。

比如

 

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int g = 1;
Console.WriteLine(g.extensions()); //注意g.extensions() 。g是一个int类型
//可是却有extensions()方法。其实是我把int增强了
        }
}
}

 

extensions就是一个扩展方法。

为什么会有这个效果呢?

其实之前我建立一个静态类,和一个静态方法。而且方法接受的参数是 extensions(this int k)。

上代码^_^

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public static class Class1 //必须为静态类,类名无所谓
    {
public static int extensions(this int k) //静态方法。必须是静态的。
//接受的类型之前加this。其中int可以替换为你想增强的东东。我增强int一个我自己写的新方法
        {
return k + 1;
}
}
}

这样就非常简单的实现不修改代码
直接扩展方法。
其中代码:


g.extensions()

 

被编译成了


Class1。extensions(g)

 

这个指针之类的有关系,俺暂时没有深入了解,所以不乱忽悠了。

注意:

1 方法扩展有优先级。实例方法>所在的namespace>别的namespace

2 记得类、方法要用静态。 

 

匿名对象


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var qq = new {name="你好",pass=123 };  //不创建类 直接构建一个匿名类型
            var vv = new { name="hello",pass=333}; //甚至不用写属性的类型,编译的时候会自动判断
            Console.WriteLine(qq.name);
Console.WriteLine(vv.name);
Console.WriteLine(qq.pass+vv.pass);//使用起来和平时没区别。
        }
}
}

 

匿名类型。不创建类 直接构建一个匿名类型,甚至不用写属性的类型,编译的时候会自动判断,使用起来和平时没区别。

只是有点局限性,不适合跨越传递。

注意:

1 其中声明的qq和vv可以互相赋值。只要编译器判断的属性类型相同。

2 声明的匿名类型全部继承Object

 

–!写完了,有兴趣的,记得装个VS2008试试。不知道在公司用这些老板会不会发飙?:-D

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏