C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#由C语言和C++派生而来,继承了其强大的性能,同时又以.NET 框架类库作为基础,拥有类似Visual Basic的快速开发能力。C#由安德斯·海尔斯伯格主持开发,微软在2000年发布了这种语言。
目录
|
C#的发音为C Sharp,“#”读作“sharp”(国际音标:/ʃɑ:p/),看起来像是“C++”中两个加号重叠在一起,而且在音乐中“C#”表示C升半音,为比C高一点的音节。微软借助这样的命名,表示C#在一些语言特性方面对C++的提升。微软希望借助这种语言来取代Java。C#已经成为Ecma国际和国际标准组织的标准规范。
ECMA标准列出的C#设计目标:
原Borland公司的首席研发设计师安德斯·海尔斯伯格(Anders Hejlsberg)在微软开发了Visual J++ 1.0,很快的Visual J++由1.1版本升级到6.0版。SUN公司认为Visual J++ 违反了Java开发平台的中立性,对微软提出了诉讼。2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,发表新的语言C#。C#语言取代了Visual J++,语言本身深受 Java、C 和 C++ 的影响。
版本 | 语言规格 | 日期 | .NET框架的版本 | Visual Studio的版本 | ||
---|---|---|---|---|---|---|
ECMA | ISO/IEC | Microsoft | ||||
C# 1.0 | 2002年12月 | 2003年四月 | 2002年一月 | 2002年一月 | .NET Framework 1.0 | Visual Studio .NET 2002 |
C# 1.2 | 2003年十月 | 2003年四月 | .NET Framework 1.1 | Visual Studio .NET 2003 | ||
C# 2.0 | 2006年六月 | 2006年九月 | 2005年九月 | 2005年11月 | .NET Framework 2.0 | Visual Studio 2005 |
C# 3.0 | 2007年八月 | 2006年11月 | .NET Framework 3.5 | Visual Studio 2008 | ||
C# 4.0 | 2010年四月 | 2010年四月 | .NET Framework 4 | Visual Studio 2010 | ||
C# 4.5 | 2012年十月 | 2012年4月 | .NET Framework 4.5 | Visual Studio 2012 |
相对于C和C++,这个语言在许多方面进行了限制和增强:
针对于.NET SDK 2.0(相对应于ECMA-334 标准第三版),C# 的新特性有:
分部类将类型的实现分在多个文件中。该概念于 C# 中首次出现,除了能将一个类的成员分开存放,还使 ASP.NET 中的代码后置得以实现。代码后置实现了 HTML 代码和后台交互代码的分离。
file1.cs:
public partial class MyClass1 { public void MyMethod1() { // implementation } }
file2.cs:
public partial class MyClass1 { public void MyMethod2() { // implementation } }
分部类这个特性允许将一个类的编写工作分配给多个人,一人写一个文件,便于版本控制。它又可以隔离自动生成的代码和人工书写的代码,例如设计窗体应用程序时。
泛型,或参数化类型,是被C#支持的.NET 2.0特性。不同于C++模版,.NET 参数化类型是在运行时被实例化,而不是编译时,因此它可以跨语言,而C++模版却不行。它支持的一些特性并不被C++模版直接支持,比如约束泛型参数实现一个接口。另一方面,C# 不支持无类型的泛型参数。不像Java中的泛型,在CLI虚拟机中,.NET generics 使用 具化 生成泛型参数,它允许优化和保存类型信息。[1]
静态类它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。
一种新形式的迭代器 它提供了函数式编程中的generator,使用yield return
类似于Python中使用的yield
// Method that takes an iterable input (possibly an array) // and returns all even numbers. public static IEnumerable<int> GetEven(IEnumerable<int> numbers) { foreach (int i in numbers) { if (i % 2 == 0) yield return i; } }
匿名方法类似于函数式编程中的闭包。[2]
public void Foo(object parameter) { // ... ThreadPool.QueueUserWorkItem(delegate { // anonymous delegates have full access to local variables of the enclosing method if (parameter == ...) { // ... } // ... }); }
委托签名的协变和逆变,[3]
例子:
string status = string.Empty; public string Status { get { return status; } // anyone can get value of this property, protected set { status = value; } // but only derived classes can change it }
可空类型 (跟个问号, 如 int? i = null;
) 允许设置 null
给任何类类型。
int? i = null; object o = i; if (o == null) Console.WriteLine("Correct behaviour - runtime version from September 2005 or later"); else Console.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");
(??
) 用于如果类不为空值时返回它自身,如果为空值则返回之后的操作
object nullObj = null; object obj = new Object(); return nullObj ?? obj; // returns obj
主要用作将一个可空类型赋值给不可空类型的简便语法
int? i = null; int j = i ?? 0; // Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.
C# 作为当前版,发布于2007年10月17日,是.NET Framework 3.5 的一部分, 它的新特性灵感来自于函数式编程语言,如:Haskell 和 ML,并广泛地引入了Language Integrated Query (LINQ) 模式到通用语言运行库中e.[4]
语言集成查询(英语:Language Integrated Query,缩写:LINQ):[5] 上下文相关关键字"from
, where
, select
" 可用于查询SQL、XML、集合等。这些标识符在LINQ上下文中被作为关键字,但是它们的增加不会破坏原有的名为from
、where
或select
的变量。
Customer c = new Customer(); c.Name = "James";
可写作:
Customer c = new Customer { Name="James" };
MyList list = new MyList(); list.Add(1); list.Add(2);
可写作
MyList list = new MyList { 1, 2 };
假设 MyList
实现了 System.Collections.IEnumerable
且有一个Add
方法method[6]
var x = new { Name="James" };
局部变量 类型推断:
var x = new Dictionary<string, List<float>>();
等同于
Dictionary<string, List<float>> x = new Dictionary<string, List<float>>();
它只是一个语法糖, 这个特性被匿名类型声明时所需要
Lambda表达式指:
listOfFoo.Where( delegate(Foo x) { return x.Size > 10; } )
listOfFoo.Where(x => x.Size > 10);
编译器翻译Lambda表达式为强类型委托或强类型表达式树.
编译器将自动生成私有变量和适当的getter(get访问器)和setter(set访问器),如:
public string Name { get; private set; }
扩展方法指,一个静态类包含this关键字作为方法的第一参数时,这个方法将被添加到该this的类型中:
public static class IntExtensions { public static void PrintPlusOne(this int x) { Console.WriteLine(x + 1); } } int foo = 0; foo.PrintPlusOne();
允许代码生成器生成方法声明作为扩展点,如果有人在另一个部分类实现了它才会被包含于原代码编译。[7]
例子:
partial class C { static partial void M(int i); // defining declaration } partial class C { static partial void M(int i) { dosomething(); } }
C# 4.0 新增 dynamic关键字,提供动态编程(dynamic programming),把既有的静态对象标记为动态对象,类似javascript, Python 或 Ruby。
dynamic calc = GetCalculator(); int sum = calc.Add(10, 20);
public StreamReader OpenFile( string path, int bufferSize = 1024) { ... }
调用 OpenFile 时, 顺序可以完全颠倒:
OpenFile(bufferSize: 4096, path: "foo.txt");
在 C#中打开一个Word文件:
static void Main(string[] args) { Word.Application wordApplication = new Word.Application() {Visible = true}; wordApplication.Documents.Open(@"C:\plant.docx", ReadOnly: true); }
在C#中指定Excel的某一格文字:
excelObj.Cells[5, 5].Value = "This is sample text";
C# 4.0 支持协变和逆变,例如在泛型接口可以加上in、out关键字。
public interface IComparer<in T> { public int Compare(T left, T right); } public interface IEnumerable<out T> : IEnumerable { IEnumerator<T> GetEnumerator(); }
C#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似,它被编译成为中间代码(Microsoft Intermediate Language),然后通过.NET Framework的虚拟机——被称之为通用语言运行库(Common Language Runtime)——执行。
所有的.Net编程语言都被编译成这种被称为MSIL(Microsoft Intermediate Language )的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。但是实际上,如果计算机上没有安装.Net Framework,那么这些程序将不能够被执行。
在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。
微软公司已经向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。现在有一些独立的实现正在进行,包括:
下面是一个在命令行上输出 Hello World 的小程序,这种程序通常作为开始学习程序语言的第一个步骤:
using System; public class HelloWorld { public static void Main(string[] args) { Console.WriteLine("Hello world!"); } }
C# 有5个著名的编译器(compilers):
|
隐藏▲
.NET Framework
|
||||||
---|---|---|---|---|---|---|
架构 |
基类库 ·
共同语言运行期组件 ·
程序码访问安全性 ·
程序集 ·
中介数据 ·
COM互通性
|
|||||
共同语言基础架构 |
共同语言基础架构(CLI) ·
共同类型系统 ·
共同中介语言 ·
虚拟运行系统
|
|||||
CLI 支持语言 |
|
|||||
组件 |
ADO.NET (Entity Framework ·
Data Services) ·
ASP.NET (AJAX ·
MVC ·
Dynamic Data) ·
WPF ·
Remoting ·
LINQ ·
Windows CardSpace ·
WCF ·
Windows Forms ·
XAML ·
ClickOnce ·
WF (WWF) ·
Dynamic Language Runtime ·
Parallel FX Library (PLINQ ·
TPL)
|
|||||
其他平台实现 |
Mono ·
Compact Framework ·
Micro Framework ·
Portable.NET ·
Silverlight ·
SSCLI
|
|||||
比较 |
C#与Java ·
C#与Visual Basic .NET ·
Java与.NET平台
|
|||||
即将推出 |
"Acropolis" ·
"Jasper"
|
|||||
1 微软在 Visual Studio或 .NET Framework中提供了或者将提供支持的语言
2 被多数用户使用,且非教学或研究型的语言。 |