11年c#4.0四大新特性代码示例与解读

名字什么都是浮云 名字什么都是浮云     2022-08-03     372

关键词:

摘要:今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。

  之前的文章中,我们曾介绍过C#的历史及C# 4.0新增特性,包括:dynamic、 命名和可选参数、动态导入以及协变和逆变等。今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。

  1.dynamic ExpandoObject

  熟悉js的朋友都知道js可以这么写 :

var t = new Object(); t.Abc = ‘something’; t.Value =243;

  现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:

    static void Main(string[] args)
  {
        dynamic t = new ExpandoObject();
        t.Abc ="abc";
        t.Value =10000;
        Console.WriteLine("t‘s abc = {0},t‘s value = {1}", t.Abc, t.Value);
        Console.ReadLine();

  }

  C# 4.0中新增了一个命名空间System.Dynamic来实现对此应用的支持,这种用法的意义何在,现在我还不太清楚,也是C#向动态语言过渡的一种试探吧。

  2.泛型自动转换

  在C# 4.0之前下面的代码是不可以编译通过的

   IEnumerable<object> objs = new List<string> { "I‘m 0","I‘am 1","I‘am 2" };

  在C# 4.0中这种声明是允许的,不过也仅限于泛型接口,泛型类型的类似做法是不允许的,如下代码是有编译错误的

   List<object> objList = new List<string> { "I‘am 0","I‘am 1","I‘am 2" };

  3.方法参数之可选参数

  如下方法声明的语法

   static void DoSomething(int notOptionalArg, string arg1 ="default Arg1", string arg2 ="default arg2")
  {
      Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
  }

  这个方法有三个参数第一个是必选参数,第二个和第三个是可选参数,他们都有一个默认值。

  这种形式对固定参数的几个方法重载很有用。如下调用:

   static void Main(string[] args)
  {
        DoSomething(1);
        DoSomething(1, "葫芦");
        DoSomething(1, "葫芦", "黄瓜");
        Console.ReadLine();
  }

  也许你会想到,假如我有一个和可选参数方法某个参数相同的方法签名的方法时,C#会怎么处理呢,我们看下下面的代码

   static void DoSomething(int notOpArg, string arg)
  {
        Console.WriteLine("arg1 = {0}", arg);
    }

  这里又重载了一个DoSomething这个方法有两个参数,但是没有可选参数,

  实验证明调用DoSomething(1,”arg”)时会优先执行没有可选参数的方法。

  4.方法参数之命名参数

  命名参数让我们可以在调用方法时指定参数名字来给参数赋值,这种情况下可以忽略参数的顺序。如下方法声明:

   static void DoSomething(int height, int width, string openerName, string scroll)
  {
        Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
  }

  我们可以这样来调用上面声明的方法

   static void Main(string[] args)
  {
      DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
      Console.ReadLine();
  }

  很显然的这是一个语法糖,但是在方法参数很多的情况下很有意义,可以增加代码的可读性。

jdk1.8新特性——四大内置核心函数式接口(代码片段)

目录一、jdk1.8内置的四大核心函数式接口二、消费型函数式接口示例三、供给型函数式接口示例四、函数型函数式接口示例五、断言型函数式接口示例一、jdk1.8内置的四大核心函数式接口Consumer:消费型函数式接口,指方法有... 查看详情

visualstudio2010与c#4.0新特性--variance-变性

 Variance变性泛型的某个方面会让人感到奇怪,比如下面的代码是不合法的——IList<string>strings=newList<string>();  IList<object>objects=strings; 第二个赋值是不允许的,因为strings和objects的元素类型并不一样。... 查看详情

整理java11新特性总结(代码片段)

闲语2018年9月25日,Java11正式发布,与JDK10不同,JDK11将提供长期支持,还将作为Java平台的参考实现以及标准版(JavaSE)11。Oracle直到2023年9月都会为JDK11提供一级支持,而补丁和安全警告等扩展支持将延续到2026年。新的LTS版本每... 查看详情

jdk1.8新特性(四大函数式接口与stream流式计算)(代码片段)

一、四大函数式接口概念:只有一个方法的接口@FunctionalInterfacepublicinterfaceRunnablepublicabstractvoidrun();1.Function接口源码:Demo:packagecom.chenchen;importjava.util.function.Function;/***Function函 查看详情

c++11新特性详解(代码片段)

C++11新特性详解C++11简介列表初始化{}初始化std::initializer_list声明auto(在C++中不支持C语言中原来auto的用法)decltypenullptr范围for循环STL中一些变化右值引用和移动语义左值引用和右值引用左值引... 查看详情

c++11新特性详解(代码片段)

C++11新特性详解C++11简介列表初始化{}初始化std::initializer_list声明auto(在C++中不支持C语言中原来auto的用法)decltypenullptr范围for循环STL中一些变化右值引用和移动语义左值引用和右值引用左值引... 查看详情

c/c++c++11新特性:初探右值引用与转移语义(代码片段)

参考自:右值引用与转移语义(李胜利)C++11之前,右值是不能被引用的,最大限度就是用常量引用绑定一个右值,如:constint&a=1;为了与左值引用区分,右值引用&&表示。如下:#incl... 查看详情

redis新特性篇:多线程模型解读(代码片段)

...在2020年5月正式推出6.0版本,提供很多振奋人心的新特性,所以备受关注。❝码老湿,提供了啥特性呀?知道了我能加薪么?主要特性如下:多线程处理网络IO;客户端缓存;细粒度权限控制(AC... 查看详情

pg11新特性解读:新增非空默认值字段不需要重写表-原理

本文对原理进行解读 查看详情

11g新特性与12c新特性

1.11g新特性概图 管理新特性> 开发新特性>     2.12c新特性概图  查看详情

openkruisev0.10.0新特性workloadspread解读(代码片段)

...; 针对需求,OpenKruise在v0.10.0版本中新增了WorkloadSpread特性。目前它支持配合Deployment、ReplicaSet、CloneSet这些workload,来管理它们下属Pod的分区部署与弹性伸缩。下文会深入介绍WorkloadSpread的应用场景和实现原理,帮助用... 查看详情

个推解读android13新特性,发布《android13适配指南》(代码片段)

8月16日,谷歌宣布Android13新系统的源代码已经上传到Android开源项目(AOSP)中,Android13正式发布。自从2022年2月Android13第一个预览版上线以来,历经7个月的测试和优化,正式版本的Android13终于来了!Andro... 查看详情

个推解读android13新特性,发布《android13适配指南》(代码片段)

8月16日,谷歌宣布Android13新系统的源代码已经上传到Android开源项目(AOSP)中,Android13正式发布。自从2022年2月Android13第一个预览版上线以来,历经7个月的测试和优化,正式版本的Android13终于来了!Andro... 查看详情

c++11新特性详解(代码片段)

C++11新特性详解C++11简介列表初始化{}初始化std::initializer_list声明auto(在C++中不支持C语言中原来auto的用法)decltypenullptr范围for循环STL中一些变化右值引用和移动语义左值引用和右值引用左值引... 查看详情

c++11精要:部分语言特性(代码片段)

...仅是对并发的支持,还有许多新程序库和C++新特性。对于线程库和本书其他章节涉及的某些C++新特性,本附录给出了简要概览。虽然这些特性都与并发功能没有直接关系(thread_local除外,见A.8节)&... 查看详情

c++11新特性(代码片段)

文章目录NULL和nullptrauto和decltype花括号初始化=default、=deletenoexceptoverridefinal右值引用lambda表达式NULL和nullptrnullptr的出现以避免将空指针NULL转为整数0带来的错误.auto和decltype都是从表达式的类型推断出要定义的变量类型,... 查看详情

jdk11新特性——更简化的编译运行程序(代码片段)

目录一、概述二、注意事项三、注意事项1——代码示例3.1、示例13.2、示例23.3、示例3四、注意事项2——代码示例4.1、示例14.2、示例2一、概述JEP330:增强java启动器支持运行单个java源代码文件的程序。在我们的认知里面,要运... 查看详情

jdk11新特性——更简化的编译运行程序(代码片段)

目录一、概述二、注意事项三、注意事项1——代码示例3.1、示例13.2、示例23.3、示例3四、注意事项2——代码示例4.1、示例14.2、示例2一、概述JEP330:增强java启动器支持运行单个java源代码文件的程序。在我们的认知里面,要运... 查看详情