zoukankan      html  css  js  c++  java
  • C#各版本功能集锦和应用

    C#1.0版本 :

    • 接口的隐式实现和显式实现 : 一遍情况下我们在继承接口时针对的接口的方法进行实现
     /// <summary>
        /// 接口
        /// </summary>
        public interface IUserInfo 
        {
            //定义方法
            void show();
        }
    
        /// <summary>
        /// 实现类
        /// </summary>
    
        public class UserInfo : IUserInfo 
        {
            /// <summary>
            /// 实现方法
            /// </summary>
            public void show()
            {
                Console.WriteLine("UserInfo的Show方法");
            }
        }
    View Code

    这样的方式使得我们在业务逻辑中使用时必须要这样做 

    UserInfo u = new UserInfo();
     u.show();
    View Code

    带来的问题是:高耦合

    我们可以这样解决这样子来显示实现接口的方法就是当前方法名为:接口+要实现的方法名 ,带调用的时候可以如下调用(注意这是两段不一样的代码,请不要直接复制运行)

    /// <summary>
            /// 实现方法
            /// </summary>
             void IUserInfo.show()
            {
                Console.WriteLine("UserInfo的Show方法");
            }
    
    ///调用
     IUserInfo id = new UserDataInfo();
      id.show();
    View Code

     C#2.0版本 : 

    • 匿名方法
    • 协变和逆变
    • 泛型
    • 迭代器
    • 可空类型
    • 局部类型

    泛型: 一般的我们想要编写一个通用的集合迭代器,会使用Object,这个是所有类型的基类,

     public class DataBag 
        {
            List<object> list = new List<object>();
            public void Add(object data) 
            {
                list.Add(data);
            }
    
        }
    View Code

    然后在使用时会采用转型的方式,但是这无疑会发生性能方面的问题,涉及到了装箱和拆箱,

    public class DataBag 
        {
            List<object> list = new List<object>();
            public void Add(object data) 
            {
                list.Add(data);
            }
    
            public void show() 
            {
                foreach (var item in list)
                {
                    (item as UserInfo).MyProperty = "测试";
                }
            }
        }
    
        public class UserInfo 
        {
            public string MyProperty { get; set; }
        }
    View Code

    喜迎泛型: 泛型类型参数也可以被限制。泛型约束是强大的,允许有限范围的可用类型参数,因为它们必须遵守相应的约束。有几种方法可以编写泛型类型参数约束,请参考以下语法:语法类型/方法名<T> where T : class,new

    public class DataBag<T>  where T : struct { /* T 是值类型*/ }
    public class DataBag<T> where T : class { /* T 可以是类接口等引用类型*/ }
    public class DataBag<T> where T : new() { /* T 必须有无参构造函数  */ }
    public class DataBag<T> where T : IPerson { /* T 继承IPerson */ }
    public class DataBag<T> where T : BaseClass { /* T 来源于BaseClass */ }
    public class DataBag<T> where T : U { /* T继承U, U也是泛型类型参数。 */ }
    View Code

    多个约束是允许的,我们只要用逗号分隔即可。类型参数约束立即被强制执行,这使得如果编译错误可以立即提醒我们。让我们看看下面DataBag类的约束条件。

     public class DataBag<T> where T : class,UserInfo
        {
            List<T> list = new List<T>();
            public void Add(T data) 
            {
                list.Add(data);
            }
    
            public void show() 
            {
                foreach (var item in list)
                {
                    item.MyProperty = "测试";
                }
            }
        }
    View Code

    C#3.0版本

    • 匿名类型
    • 自动实现属性
    • 表达树
    • 扩展方法
    • Lambda表达
    • 查询表达式

    Lambda表达式: 在有些时候我们需要对数据进行筛选过滤,一般地我们会使用循环遍历来解决这样的问题 :

    List<int> list = new List<int>();
    
                for (int i = 0; i < 20; i++)
                {
                    list.Add(i);
                }
    
                //找到数字为15的那条数据
    
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i]==15)
                    {
                        Console.WriteLine(list[i]);
                    }
                }
    
                foreach (var item in list)
                {
                    if (item==15)
                    {
                        Console.WriteLine(item);
                    }
                }
    View Code

    这是一个很普通寻常的循环遍历相信大家都会,但是一般的我们的类型都会输一个类一个引用类型,再比如我们需要统计时怎么去做?

     class Program
        {
            static void Main(string[] args)
            {
                List<UserInfo> list = new List<UserInfo>();
    
                list.Add(new UserInfo() { Age = 18, Name = "李磊" });
                list.Add(new UserInfo() { Age = 20, Name = "韩梅梅" });
                list.Add(new UserInfo() { Age = 21, Name = "玛丽" });
                list.Add(new UserInfo() { Age = 18, Name = "夏洛" });
    
                int Sum = list.Sum(u => u.Age);
    
                double Avg = list.Average(u=>u.Age);
    
                Console.WriteLine("集合中的用户总年龄是"+Sum+"平均年龄是 "+Avg);
    
                UserInfo ui = list.First(u => u.Name == "李磊");
                Console.WriteLine(string.Format("筛选单个用户信息 {0}: 年龄:{1}",ui.Name,ui.Age));
    
                List<UserInfo> list_ui = list.Where(u => u.Age==18).ToList();
    
                Console.WriteLine(string.Format("筛选年龄为18岁的记录  一共有 {0} 人",list_ui.Count));
                foreach (var item in list_ui)
                {
                    Console.WriteLine(string.Format("用户信息 {0}: 年龄:{1}", item.Name, item.Age));
                }
            }
        }
    
        public class UserInfo 
        {
            public string Name { get; set; }
    
            public int Age { get; set; }
        }
    View Code

    C#4.0版本

    • 动态绑定
    • 嵌入式互操作类型
    • 泛型协变和逆变
    • 实名/可选参数

    C#5.0版本

    像C#4.0版本一样,C#5.0版本中没有太多功能 - 但是其中一个功能非常庞大。

    • 异步/等待
    • CallerInfoAttributes

    C#6.0版本

    C#6.0的推出有很多很大的进步,很难选择我最喜欢的功能。

    • 字典初始化
    • 异常过滤器
    • 在属性里使用Lambda表达式
    • nameof表达式
    • 空值运算符
    • 自动属性初始化
    • 静态导入
    • 字符串嵌入值

    C#7.0版本

    从所有集成到 C# 7.0的特性中。

    • 更多的函数成员的表达式体
    • 局部函数
    • Out变量
    • 模式匹配
    • 局部变量和引用返回
    • 元组和解构
  • 相关阅读:
    重新整理数据结构与算法(c#)——算法套路迪杰斯特拉算法[三十一]
    重新整理数据结构与算法(c#)——算法套路k克鲁斯算法[三十]
    重新整理数据结构与算法(c#)——算法套路普利姆算法[二十九]
    arp 的概念解析
    什么是ip协议二
    什么是ip协议一
    python自动化报告的输出
    使用wxpy自动发送微信消息
    Pycharm2017常用快捷键
    【新番】不正经的魔术讲师与禁忌教典【全集更新中】
  • 原文地址:https://www.cnblogs.com/huanjinyuan/p/8340429.html
Copyright © 2011-2022 走看看