一起谈.NET技术,C#中的语言特性都是从何而来?

简介:   前几天推荐一个同事用“可选参数”,推荐完了我还画蛇添足的说这是.Net 4中的新特性。但是事后才发现这个新特性是C# 4.0的语言特性,与.Net 4无关。其实也不只这一次,我平时也经常把语言、框架、运行时,有时甚至还有开发工具混为一谈。

  前几天推荐一个同事用“可选参数”,推荐完了我还画蛇添足的说这是.Net 4中的新特性。但是事后才发现这个新特性是C# 4.0的语言特性,与.Net 4无关。其实也不只这一次,我平时也经常把语言、框架、运行时,有时甚至还有开发工具混为一谈。于是今天就总结一下C#中我感兴趣的几个语言特性是从何而来的。

  1.可选参数

  可选参数是C# 4.0中的新特性,其作用在于在调用者不提供参数值时给参数一个默认值,用起来是这样的:

   
   
static void Main( string [] args)
{
TestMethod();
TestMethod(
10 );
Console.ReadLine();
}
public static void TestMethod( int parameter = 5 )
{
Console.WriteLine(parameter);
}
以上的代码在第一次调用TestMethod时输出5,第二次输出10,也就是在没有给TestMethod提供参数值时,会自动以5作为参数值。

  该特性的实现依赖于OptionalAttribute和DefaultParameterValueAttribute这两个attribute,也就是说TestMethod这个方法完全可以声明为这样:

  
  
public static void TestMethod([Optional, DefaultParameterValue( 5 )] int parameter)
{
Console.WriteLine(parameter);
}

  而跑起来的结果是一样的。

  OptionalAttribute和DefaultParameterValueAttribute这两个attribute分别是在.Net 1.1和.Net 2.0中引入的,也就是说N年前大家就可以写拥有“可选参数”的方法了,只是用起来没有现在这么爽。

  只要您安装了.Net Framework 4.0(也就是说有了其中附带的新版的C#编译器),您就可以编写如上的代码而同时把target framework指定为.Net Framework 2.0到.Net Framework 4之间的任何版本。

  小总结:我在这个问题上犯的错误就在于将语言和框架混为一谈了。C#语言的第四版和.Net Framework的第四版一起发布,于是我就理所当然的认为C# 4.0中的新特性和.Net Framework 4有关系了。其实,只要微软的人愿意,他们完全可以在.Net Framework 2.0发布之后和.Net Framework 4.0发布之前的任意时间发布一款CTP的编译器来实现这一语言性特性,正如他们前不久发布的Asyn CTP一样。

  2.var关键字

  var关键字是在C# 3.0中引入的,其作用在于在声明局部变量时无需指定具体类型,用起来是这样的:

  
  
var str = " hello " ;
Console.WriteLine(str);var str
= " hello " ;
Console.WriteLine(str);

  其结果和把var替换为string完全一样。

  这个语言特性看似鸡肋,实际上它的好处在于接收LinQ语句的返回值,比如说Enumerable.GroupBy的某几个重载的返回值是IEnumerable<IGrouping<TKey, TElement>>,如果每次用到group by的时候都需要写这么长的一串代码的话,那玩儿LinQ的快感想必是要降低不少呀。

  这个语言特性的实现要比可选参数简单一些,无需框架的支持,完全是语言规范和编译器的“合谋”。编译器在编译时根据赋值语句推断出真实的类型,编译出的IL中完全没有var的身影。

  3.泛型

  泛型是C# 2.0中新增的特性,也是.Net 2.0中的新特性。没有错,这次终于可以说它是.Net的新特性了,但是也只是.Net而不是.Net Framework。

  在C#语言层面实现泛型需要CLR的支持,可以说它是.Net世界中的一等公民,IL甚至为它修改了语法。

  比如说如下的类型声明:

public class TestClass<T>

  在编译为IL之后是这样的:

  
  
. class public auto ansi beforefieldinit TestClass < T >
extends [mscorlib]System.Object

  可见IL中新增了尖括号的用法。

  以上三个语言特性都比较典型。var关键字纯粹是语言层面的小甜头,只要有了能够理解var的编译器,使用哪个版本的CLR或者.Net Framework完全无所谓。

  可选参数需要编译器能理解参数名后面的赋值语句,同时也需要.Net Framework中提供的attribute的支持。

  泛型同时需要CLR和编译器的支持。

  如果列一张表的话,就是下面这样的:

语言特性 实现该特性需要的支持
var关键字 CLR() 框架() 编译器(
可选参数 CLR() 框架() 编译器(
泛型 CLR() 框架() 编译器(

  上表中每一项的编译器都打上了钩儿。很显然,每一项语法层面的特性都需要编译器的支持,要不然语言规范就只是一纸空文了。在这里还是把它列出来,仅求全面。

  写完之后自己看一遍,觉得很是有考据癖的老学究味道。微软总是把开发工具、框架类库、运行时和编译器的新版本一起发布,所以我们总是被弄得很被动,总是搞不清这几者之间区别。其实有时候把这些东西区分开来去观察,更有利于解释一些困惑。

  当然,最后的表格中列出的东西还是太少了,希望各位补充啊。

目录
相关文章
|
1天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
20 5
|
10天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
52 13
|
25天前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
28 4
|
25天前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
29 3
|
25天前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
22 3
|
25天前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
28 3
|
18天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
18天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
46 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
74 0