c#3.0增加的功能

c#3.0增加的功能:

  • 隐含类型局部变量(var):用于解决变量声明需要重复写两次类型的麻烦

var不是一个Object类型,可以理解为一个占位符,在编译完成以后会被替代为强类型,而不是弱类型Object;(var x = 5; //推断为int类型)

var在赋值的时候是表达式,可以供编译器理解解析,且赋值的表达式不能为null(编译器不能对null推断类型)        

应用场景:

var仅限于局部变量,不能用于参数、字段(可以避免var的乱用而引起的代码不易阅读的问题)   

var可以用于foreach()语句中,提高复用度

问题:

不能到处乱用,导致代码不易阅读理解

例子:

var x = new []{ "gfjiang", "rshiping", "houkun", "xiaoxuan" }; //根据编译器推断为string[]
  • 扩展方法:用于解决不能访问源码的类进行方法的扩展(在不修改源代码的情况下)

例子:

public static class Extensions{
      public static void Foo(this String s){
        ....
      }
}
string s = "hello world";
s.Foo();

由编译技术把实例方法的调用转化成静态类的静态方法调用:s.Foo()  转换成 Extensions.Foo(s); [ 即使不是扩展方法,针对编译器,方法都是全局函数,通过传递实例完成调用,类似于实例方法调用的时候,编译也会进行转换(String s = “helow world", s.length();  编译成:length(s))]

应用场景:

能够针对需要实例化后进行的方法调用的扩展(语法糖的效果,编译时技术,效果不错),其他扩展方式可以采用:组合方式、继承方式(多态)、反射(运行时的方式添加方法,运行时技术)

继承:可以更改基类方法,扩展方法不能(如果遇到相同签名的话,则扩展方法失效,优先级为实例方法,其次为namespace最近的静态方法,然后为较远的namespace的静态方法)

问题:

容易乱用影响程序设计,容易引起问题,设计上不能依赖扩展,只能用于弥补的方式(类似于Adapter模式,是在原有代码不适用的情况下才采用的模式,如果可以修改源代码,就不用采用该模式)

  • 对象与集合初始化器

例子:

 public class Program
    {
        private class Point
        {
            public int X { get; set; }
            public int Y { get; set; }
        }
        public static void Main(string[] args)
        {
            var x = new Point { X = 3, Y = 4 };
            Console.WriteLine(x);
        }
    }

相当于编译器转换为new Point();  x.X = 3; x.Y = 4;

  • 匿名类型:不断的节省无用东西的写
new p1 = new{Name = "gfjiang", price=450.00}
new p2 = new{Name = "rshiping", price=470.00}

也是由编译器推断,直接继承于System.Object;  当该类的跨度不大的时候,就没有必要新建一个类型,由编译器临时新建一个类型即可。

编译器推断p1和p2属于同一个类型,如果p2里面的字段顺序改变,则编译器推断为不同类型       

  • Lambda表达式
var list = new List<string> { "abcd", "abce", "ab", "xyz", "abcdefg" };
//c#2.0 提供的匿名委托方法
var select = list.FindAll(delegate(string s){return s.StartsWith("abc");});

foreach (var term in select)
   Console.WriteLine(term);
//c#3.0 提供的Labmda表达式,代替匿名委托方法
//提供更自然的方式,更接近人的思维,更高级                                                                                                                                               var select1 = list.FindAll(s=>s.StartsWith("abcd"));
foreach (var term in select1)
   Console.WriteLine(term);

Lambda格式:(参数列表a,b,c...)=> 表达式或者语句块(可以有多个参数,一个参数,或者无参数,参数类型可以隐式或显示,无参数的时候直接()=> ...)

  • LINQ
            IEnumerable<string> list = from str in names
                                       where str.Length > 3 && str.StartsWith("gf")
                                       orderby str
                                       select str.ToUpper();

            foreach(var str in list)
                Console.WriteLine(str); 

            IEnumerable<string> list2 = names
                .Where(str => str.Length > 3 && str.StartsWith("gf"))
                .OrderBy(str => str)
                .Select(str => str.ToUpper());
            foreach (var str in list2)
                Console.WriteLine(str);


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值