C#的高级特性

1. C# 委托

委托是一种引用类型,它表示对具有特定参数列表和返回类型的方法的引用

语法:

  public delegate <return type> <delegate-name> <parameter list>
  • return type 表示返回类型 delegate-name 表示委托名 parameter list 表示参数列表。

定义:

  public delegate string TranslationDelegate(string name) 

详细事例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        public delegate void Translation(string name);
        static void Main(string[] args)
        {
            //注意 这里使用了多播委托
            Translation tr = new Translation(Eating);
            tr += new Translation(Watch);
            tr("戴教授");
            Console.WriteLine();
        }
        private static void Eating(string name)
        {
            Console.WriteLine(name + "在吃放"); 
        }
        private static void Watch(string name)
        {
            Console.WriteLine(name+"在看电视"); 
        }
    }
}

在这里插入图片描述

2. 隐式类型与匿名类型

2.1 隐式类型

语法:

  var 变量 = 初始值;

事例:

新建实体类 User

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class User
    {
        public string name { get; set; }
        public int age { get; set; }
        public bool isMarry { get; set; }
        User()
        {

        }
        User (string name,int age,bool isMarry)
        {
            this.name = name;
            this.age = age;
            this.isMarry = isMarry;
        }
    }
}


主函数代码

static void Main(string[] args)
        {
            var user = new User("李金", 20, false);
            Console.WriteLine("user类型:" + user.GetType());
            Console.WriteLine("name类型:" + user.name.GetType());
        }

在这里插入图片描述

使用隐式类型虽然可以简化代码,但同样也存在限制。

  1. 变量必须初始化,否则报错var a ; //会报错 应 var a = 1;
  2. 声明变量,推断出类型后,变量的类型不能改变var a = 1; a = "1"//错误

2.2 匿名类型

匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,无需先显示定义一个类型。

用法如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        public delegate void Translation(string name);
        static void Main(string[] args)
        {
            var a = new { age = 20,name = "张三",id=1001 };
            Console.WriteLine("姓名:{0},编号:{1},年龄:{2}",a.name,a.id,a.age);
        }
       
    }
}

在这里插入图片描述

3. C#扩展方法与yield关键字

扩展方法

C#扩展方法是允许使用实例方法的调用语法来调用静态方法的语言功能。C#扩展方法至少有一个参数。

使用实例:
创建一个静态类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public static class Class1
    {
         public static int Countst(this string str)
        {
            //将字符串分割用于计算数量
            return str.Split(new char[] { ' ', '.', '?' },StringSplitOptions.RemoveEmptyEntries).Count();
        }
    }
}

调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApp1
{
    class Program
    {
        public delegate void Translation(string name);
        static void Main(string[] args)
        {
           

            string str = "sdfsdf/sadfasdfasdf,adsfsadf.dsfasdf";
            int count = str.Countst();
            Console.WriteLine(count);
        }
       
    }
}

注意:扩展方法参数前面必须加this修饰符

yield关键字

迭代器C#2.0中的新功能
使用如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApp1
{
    class Program
    {
        public static IEnumerable<User> getList(List<User> list,int age)
        {
            foreach (var item in list)
            {
                if (item.age == age)
                {
                    yield return item;
                }
            }
        }
        
        static void Main(string[] args)
        {


            List<User> list = new List<User>();
            list.Add(new User("张三", 20, false));
            list.Add(new User("李四", 20, false));
            list.Add(new User("王五", 21, true));
            IEnumerable<User> obj = getList(list,20);
            foreach (var item in obj)
            {
                Console.WriteLine("姓名:{0},年龄:{1}",item.name,item.age);
            }
        }
       
    }
}

在这里插入图片描述

Lambda表达式

Lambda表达式是一个匿名方法,即没有方法名的方法。
语法

形参列表 => 方法体	·
  public delegate void Del(string str)
  public static void GetSay(){
    Del md = new Del(x=>{
  Console.WriteLine("你好:"+x)
})
  md("李四");
}
  static void Main(string [] args){
  GetSay();
  //控制台输出 你好:李四
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值