C#中的语言特性“.NET研究”都是从何而来?

  前几天推荐一个同事用“可选参数”,推荐完了我还画蛇添足的说这是.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() 框架() 编译器(

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

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

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

时间: 2024-09-20 20:39:25

C#中的语言特性“.NET研究”都是从何而来?的相关文章

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

前几天推荐一个同事用"可选参数",推荐完了我还画蛇添足的说这是.Net 4中的新特性.但是事后才发现这个新特性是C# 4.0的语言特性,与.Net 4无关.其实也不只这一次,我平时也经常把语言.框架.运行时,有时甚至还有开发工具混为一谈.于是今天就总结一下C#中我感兴趣的几个语言特性是从何而来的. 1.可选参数 可选参数是C# 4.0中的新特性,其作用在于在调用者不提供参数值时给参数一个默认值,用起来是这样的: static void Main(string[] args){ Test

C# 动态语言特性,dynamic 关键字研究

原文:C# 动态语言特性,dynamic 关键字研究 1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 JavaScript 根本没使用过,别人一定把你当成从火星回来的吧! 很多使用过 JavaScript 的程序员,刚开始对其动态特性深恶痛绝,欲除之而后快,但是一旦熟悉这个语言以后,又会发疯般的爱上她(我的野蛮女友). 以创建一个"人"为例,

理解Javascript的动态语言特性

  这篇文章主要介绍了理解Javascript的动态语言特性,需要的朋友可以参考下 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? ? 1 2 3 4 5 6 7 var i = 100; function myFunc() { var

iOS 各版本中的新特性(What&amp;#39;s New in iOS)- 目录翻译完成

iOS 各版本中的新特性(What's New in iOS) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 介绍 Introduction文档组织结构 Organization of Thi

理解Javascript的动态语言特性_javascript技巧

Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? var i = 100; function myFunc() { var i = 'test'; eval('i = "hello."'); } myFunc(); alert(i

J2SE 5.0专题 之 语言特性

j2se J2SE 5.0专题 之 语言特性                         本文作者: 高宇翔(大胃) 1.1.        背景J2SE(TM) 5.0正式发布至今已超过3个月的时间了,就在前不久,大概是在两周之前,Sun又发布了更新过的JDK 5.0 Update 1,改掉了一些第一个版本中出现的bug. 由于Java社群等待这一从1.4向5.0版本升级已经有相当长的一段时间,大家都很关心5.0中有哪些值得关注的变化,于是blog的相关信息满天飞,我也兴冲冲地在自己的bl

Java中异常机制的深入研究

由于本文旨在探讨Java"异常机制"的深层原理,因此关于"异常"的使用方法都不做详细说明.首先看一段非常熟悉的用于打开一个文件的C程序段: FILE *fp;fp=fopen(filename,"rw");if(fp==NULL){ printf("cannot open file\n"); exit(0);} 在这段程序中,if条件语句中的一段用来处理没有找到指定文件,或者其它原因无法正确打开指定文件.可是如果遇到一个责任心

Visual Basic .NET中的语言创新

visual Visual Basic .NET中的语言创新 引言 要快速地创建企业Web应用程序,开发人员必须依靠可伸缩的.健壮的.可重用的商务逻辑.在过去的几年中,面向对象的程序设计已经成为了创建满足这些需求的系统的主要技术.使用面向对象的程序设计语言可以使得大型系统更容易理解,更容易调试,并且更新速度更快. 为了使Visual Basic开发人员从面向对象的设计中获益,简化企业Web应用程序的开发,将在Visual Basic的下一个版本 - Visual Basic .NET中支持包括实

ASP 3.0中的新特性

    假如读者已经熟悉了ASP 2.0,并正在寻找3.0版本中的实际改变的列表,那么将在下面发现这些信息.假如读者是一个ASP的初学者,可以越过本章到下一章,那里循序渐进地介绍了ASP对象和它们的用法.    ASP 3.0新特性概要    在ASP 3.0中,有一些新的特性或经历较大的变化或改进的特性.    1. 无脚本的ASP    如早先提到的, ASP处理不包括任何脚本的.asp页的速度是很快的,假如你正在创建的站点或Web应用程序文件最终可能使用ASP,最好让这些文件使用.asp文