俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

C#语言各个版本特性(一)

一、c#版本中添加的功能:

第五章 方法

C#2.0 

  • 泛型

  • 部分类型

  • 匿名方法

  • 迭代器

  • 可空类型

  • Getter / setter单独可访问性

  • 方法组转换(代表)

  • Co- and Contra-variance for delegates

  • 静态类

  • Delegate inference

1、方法是一块具有名称的代码

C#3.0 

  • 隐式类型局部变量

  • 对象和收集初始化器

  • 自动实现的属性

  • 俄罗斯贵宾会,匿名类型

  • 扩展方法

  • 查询表达式

  • Lambda表达式

  • 表达树

  • 部分方法

包括:方法体、方法头

C#4.0 

  • 动态绑定

  • 命名和可选参数

  • Generic co- and contravariance

  • 嵌入式互操作类型(“NoPIA”)

局部变量必须被赋值才可以执行下面的操作。实例变量有隐式初始化。有时候,类型推断可以用var关键字,类似于C++当中的auto。用于局部变量。

C#5.0 

  • 异步方法

  • Caller info attributes

C#中,不能在第一个名称的有效范围内去声明另一个同名的本地变量。

C#6.0 

  • Compiler-as-a-service(Roslyn)

  • 将静态类型成员导入命名空间

  • 异常过滤器

  • 在Catch和Finally中使用Await

  • 自动属性初始化器

  • 只读属性的默认值

  • Expression-bodied members

  • Null-conditional operators(空条件运算符,简洁检查)

  • 字符串插值

  • nameof operator

  • 字典初始化器

2、本地常量:局部常量。Const 关键字。Const double PI = 3.1415926; 在编译期决定其值。

C#7.0 

  • out变量

  • 模式匹配

  • 元组

  • 解构

  • 局部函数

  • 数字分隔符

  • 二进制文字

  • 局部引用和引用返回

  • 扩展异步返回类型

  • 表达式的构造函数和finalizers

  • Expression bodied getters and setters

  • throw表达式

3、 参数:形参与实参。参数也有几种:值参数/引用参数。

C#7.1 

  • Async main
  • 默认表达式

 

1.C#1.1代码

俄罗斯贵宾会 1俄罗斯贵宾会 2

 1 using System.Collections;
 2 using System.ComponentModel;
 3 
 4 namespace Chapter01.CSharp1
 5 {
 6     [Description("Listing 1.01")]
 7     public class Product
 8     {
 9         string name;
10         public string Name
11         {
12             get { return name; }
13         }
14 
15         decimal price;
16         public decimal Price
17         {
18             get { return price; }
19         }
20 
21         public Product(string name, decimal price)
22         {
23             this.name = name;
24             this.price = price;
25         }
26 
27         public static ArrayList GetSampleProducts()
28         {
29             ArrayList list = new ArrayList();
30             list.Add(new Product("West Side Story", 9.99m));
31             list.Add(new Product("Assassins", 14.99m));
32             list.Add(new Product("Frogs", 13.99m));
33             list.Add(new Product("Sweeney Todd", 10.99m));
34             return list;
35         }
36 
37         public override string ToString()
38         {
39             return string.Format("{0}: {1}", name, price);
40         }
41     }
42 }

View Code

代码局限:

           1>.ArrayList没有提供与其内部内容相关的编译时信息,可以添加任何类型数据。

            2>.代码中为属性设置了公共的get方法,则意味着要添加对应的set方法也是公共的。

            3>.用于创建属性和变量的代码过于复杂,包括一个私有变量和一个公共方法。

2.C#2.0代码

俄罗斯贵宾会 3俄罗斯贵宾会 4

 1 using System.Collections.Generic;
 2 using System.ComponentModel;
 3 
 4 namespace Chapter01.CSharp2
 5 {
 6     [Description("Listing 1.02")]
 7     public class Product
 8     {
 9         string name;
10         public string Name
11         {
12             get { return name; }
13             private set { name = value; }
14         }
15 
16         decimal price;
17         public decimal Price
18         {
19             get { return price; }
20             private set { price = value; }
21         }
22 
23         public Product(string name, decimal price)
24         {
25             Name = name;
26             Price = price;
27         }
28 
29         public static List<Product> GetSampleProducts()
30         {
31             List<Product> list = new List<Product>();
32             list.Add(new Product("West Side Story", 9.99m));
33             list.Add(new Product("Assassins", 14.99m));
34             list.Add(new Product("Frogs", 13.99m));
35             list.Add(new Product("Sweeney Todd", 10.99m));
36             return list;
37         }
38 
39         public override string ToString()
40         {
41             return string.Format("{0}: {1}", name, price);
42         }
43     }
44 }

View Code

private set{name=value;}

属性可以有公共的get访问器和私有的或者是受保护的set访问器,这有助于控制属性的设置方式。

List<T>强类型集合,可以告知编译器列表中只能包含制定的泛型,试图将一个不同的类型添加到列表中,会造成编译时错误。

3.C#3.0代码

俄罗斯贵宾会 5俄罗斯贵宾会 6

 1 using System.Collections.Generic;
 2 using System.ComponentModel;
 3 
 4 namespace Chapter01.CSharp3
 5 {
 6     [Description("Listing 1.3")]
 7     class Product
 8     {
 9         public string Name { get; private set; }
10         public decimal Price { get; private set; }
11 
12         public Product(string name, decimal price)
13         {
14             Name = name;
15             Price = price;
16         }
17 
18         Product()
19         {
20         }
21 
22         public static List<Product> GetSampleProducts()
23         {
24             return new List<Product>
25             {
26                 new Product { Name="West Side Story", Price = 9.99m },
27                 new Product { Name="Assassins", Price=14.99m },
28                 new Product { Name="Frogs", Price=13.99m },
29                 new Product { Name="Sweeney Todd", Price=10.99m}
30             };
31         }
32 
33         public override string ToString()
34         {
35             return string.Format("{0}: {1}", Name, Price);
36         }
37     }
38 }

View Code

自动实现的属性和简化的初始化大大的简化了代码。(Lambda表达式特性操作同样简捷)

硬编码列表不同的构建方式,由于没有name和price变量可供访问,我们必须在类中处处使用属性,这增强了一致性。

4.C#4.0代码

俄罗斯贵宾会 7俄罗斯贵宾会 8

 1 using System.Collections.Generic;
 2 using System.ComponentModel;
 3 
 4 namespace Chapter01.CSharp4
 5 {
 6     [Description("Listing 1.04 (and more)")]
 7     public class Product
 8     {
 9         readonly string name;
10         public string Name { get { return name; } }
11 
12         decimal? price;
13         public decimal? Price { get { return price; } }
14 
15         public Product(string name, decimal? price = null)
16         {
17             this.name = name;
18             this.price = price;
19         }
20 
21         public static List<Product> GetSampleProducts()
22         {
23             List<Product> list = new List<Product>();
24             list.Add(new Product(name: "West Side Story", price: 9.99m));
25             list.Add(new Product(name: "Assassins", price: 14.99m));
26             list.Add(new Product(name: "Frogs", price: 13.99m));
27             list.Add(new Product(name: "Sweeney Todd", price: 10.99m));
28             list.Add(new Product(name: "Unpriced"));
29             return list;
30         }
31 
32         public override string ToString()
33         {
34             return string.Format("{0}: {1}", name, price);
35         }
36     }
37 }

View Code

1>.构造函数包含多个参数时,全部使用命名参数,将不再需要记住或查找形参在所调用方法的形参列表中的顺序。

new Product(price: 9.99m,name: "West Side Story")位置相反也可以构造成功。

2>命名实参与位置实参混合时,要么命名实参位于所有位置实参后面,要么部分位置实参要处于正确的形参列表中位置。

概念:命名实参和可选实参。 通过命名实参,你可以为特定形参指定实参,方法是将实参与该形参的名称关联,而不是与形参在形参列表中的位置关联。 通过可选参数,你可以为某些形参省略实参

注意:命名实参、位置实参、可选实参的区别。

总结:

→C#1,只读属性弱类型集合

→C#2,私有属性赋值方法强类型集合

→C#3,自动实现的属性,增强的集合和对象初始化

→C#4,用命名实参更清晰地调用构造函数和方法。

值类型与值参数是两种不同的概念:值类型就是类型本身包含其值。而值参数是把实参的值复制给形参。

Void mymethod(myclass f1, int f2)

{

F1.val += 5;

F2+= 5;

}

调用: mymethod(a1,a2);

执行过程:

俄罗斯贵宾会 9

方法开始时,系统在栈中为形参分配空间,并从实参复制值。a1为引用类型,所以引用被复制,但指向相同。

在使用引用参数时,必须加关键字 ref。 void method(ref int val){ xxxx }, 方法调用 method(ref y);//必须使用变量。

举例:

Void mymethod(ref myclass f1,ref int f2)

{

F1.val += 5;

F2+= 5;

}

调用: mymethod(ref a1,ref a2);

执行过程:不会开辟新的内存单元,只是把形参名设置为实参的别名而已。a1与f1,引用相同的位置。

俄罗斯贵宾会 10

引用类型作为值参数和引用参数:

我们修改引用参数的成员时,无论是作为值参数还是引用参数,效果都一样。但,当我们去修改引用类型本身时,那么其作为值参数与引用参数是不同的。

请看下面的图形:

俄罗斯贵宾会 11

俄罗斯贵宾会 12

4、输出参数

需要加关键字 out

Void mythod(out int val); //形参也是实参的别名,且我们通过方法体之后就会知道你传入的实参的值。方法体内部会对实参赋值。

5、参数数组

前面是一个实参对应一个形参,现在是多个实参对应一个特殊的形参。

关键字:params 比如 void mythod(params int[] vals){ }

调用: int[] arrays = {1, 2 ,3}; mythod(arrays);

调用时,如果是用值类型传递,即实参是值,数组参数是值类型,实参不受影响。

如果是引用类型传递,即实参是数组名,数组参数是引用类型,实参受方法内部影响。

6、方法重载

方法名称相同,方法特征不同即可。

7、命名参数

给参数命名,这样我们可以以任意顺序调用。

Void mythod(int a, int b, int c);

参数的名字和值: 调用时指定名称和值即可。 Mythod(c:2, a:4, b: 1);

8、可选参数

本文由俄罗斯贵宾会发布于编程,转载请注明出处:C#语言各个版本特性(一)

您可能还会对下面的文章感兴趣: