C#
				✍ dations ◷ 2025-11-04 12:22:44 #C#
				C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#是一种由C和C++派生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性,使其成为C语言家族中的一种高效强大的编程语言。C#以.NET框架类库作为基础,拥有类似Visual Basic的快速开发能力。C#由安德斯·海尔斯伯格主持开发,微软在2000年发布了这种语言,希望借助这种语言来取代Java。C#已经成为Ecma国际和国际标准组织的标准规范。
C#的发音为“C sharp”,“#”读作“sharp”(/ʃɑːp/),命名启发于音乐上的音名“C♯”,在音乐中“C♯”表示C升半音,为比C高一点的音节,且“#”形似4个加号,微软借助这样的命名,以表示C#在一些语言特性方面对C++的提升的意思。
由于显示器(标准字体、浏览器等)的技术限制,且大部分的键盘布局上不存在升记号(♯),所以井号(#)被用于此编程语言的名称中,约定在ECMA-334 C#语言规范中。
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++,语言本身深受Visual Basic、Java、C和C++ 的影响。
.NET Framework 2.0 (Except LINQ)
.NET Framework 3.0 (Except LINQ)
.NET Framework 3.5
相对于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使用具化生成泛型参数,它允许优化和保存类型信息。
静态类别它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。
一种新形式的迭代器它提供了函数式编程中的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;    }} 匿名方法
匿名方法类似于函数式编程中的闭包。
public void Foo(object parameter){    // ...    ThreadPool.QueueUserWorkItem(delegate    {        // anonymous delegates have full access to local variables of the enclosing method        if(parameter == ...)        {             // ...         }        // ...    });} 委托的协变和逆变
委托签名的协变和逆变,
例子:
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# 3.0的特性
C# 3.0发布于2007年10月17日,是.NET Framework 3.5的一部分,它的新特性灵感来自于函数式编程语言,如:Haskell和ML,并广泛地引入了Language Integrated Query(LINQ)模式到通用语言运行库中e.
语言集成查询(英语:Language Integrated Query,缩写:LINQ):  上下文相关关键字"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
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;     set; }扩展方法
扩展方法指,一个静态类包含this关键字作为方法的第一参数时,这个方法将被添加到该this的类型中:
public static class IntExtensions{    public static void PrintPlusOne(this int x)     {        Console.WriteLine(x + 1);    }} int foo = 0;foo.PrintPlusOne();分部方法
允许代码生成器生成方法声明作为扩展点,如果有人在另一个部分类实现了它才会被包含于原代码编译。
例子:
partial class C{    static partial void M(int i); // defining declaration}partial class C{    static partial void M(int i)    {        dosomething();    }}C# 4.0的特性
动态查阅
C# 4.0新增dynamic关键字,提供动态编程(dynamic programming),把既有的静态对象标记为动态对象,类似javascript, Python或Ruby。
dynamic关键字标记的字段被处理成一个特殊包装的object对象,它取消了CLI的编译时类型检查
dynamic calc = GetCalculator();int sum = calc.Add(10, 20);
具名参数与可选参数
public StreamReader OpenFile(    string path,    int bufferSize = 1024){...}调用OpenFile时,顺序可以完全颠倒:
OpenFile(bufferSize: 4096, path: "foo.txt");
与COM组件交互
在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.Value = "This is sample text";
泛型的协变和逆变
C# 4.0支持协变和逆变,例如在泛型接口可以加上in、out关键字。
  public interface IComparer<in T>    {      int Compare(T left, T right);    }  public interface IEnumerable<out T> : IEnumerable  {    IEnumerator<T> GetEnumerator();  }C# 5.0的特性
- C# Evolution Matrix
 - Async Feature (补充: async和await是一对语法糖,允许开发人员非常轻松的调用基于TASK的异步编程)async-await关键字并不会真的创建一个线程池任务,完成这个动作依赖于被调用方法中的函数。这一点在许多C#的中文教程中被忽略,导致许多学习的新手误以为await关键字会直接创建一个新的线程池任务。
 - Caller Information
 
C# 6.0的特性
- 只读 Auto 属性
 - Auto 属性初始设置式
 - 具有表达式主体的函数成员:
 - 使用静态
 - Null - 条件运算符
 - 字符串插值
 - 例外状况筛选条件
 - nameof 表达式
 - Catch 和 Finally 区块中的 Await
 - 索引初始设置式
 - 集合初始设置式的扩展方法
 - 改进的重载解析
 
C# 7.0的特性
加入 out 变量;能够直接宣告一个变量在它要传入的地方,当成一个 out 的引数
C#通常不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似,它被编译成为中间代码(Microsoft Intermediate Language),然后通过.NET Framework的虚拟机——被称为通用语言运行库——执行。
所有的.Net编程语言都被编译成这种被称为通用中间语言的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。如果计算机上没有安装.Net Framework,那么这些程序会弹出对话框,要求用户下载.net framework。
在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。
微软公司已经向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。现在有一些独立的实现正在进行,包括:
下面是一个在命令行上输出Hello World的小程序,这种程序通常作为开始学习程序语言的第一个步骤: 
using System;namespace ConsoleApp1{    class Program    {        static void Main(string args)        {            Console.WriteLine("Hello World!");        }    }}实现
C# 有5个著名的编译器(compilers):
    
				相关
- 在子宫内In utero是拉丁词汇,字面意思是“在子宫里”。在生物学里它常被用来描述胚胎或胎儿状态。法律上指未出生婴儿。
 - 果蝠10种,见本文果蝠属(学名:Rousettus),哺乳纲翼手目狐蝠科的一属,而与果蝠属(棕果蝠)同科的动物尚有灰果蝠属(灰果蝠)、球果蝠属(布氏球果蝠)、狐蝠属(游狐蝠)、锥齿狐蝠属(锥齿狐蝠)等之数种
 - 统一超商统一超商(简称统一超)是台湾一家连锁便利商店,也是统一企业关系企业,拥有7-Eleven在台湾的永久经营权,以加盟连锁的方式授权经营台湾的7-Eleven。统一超商目前至2020年1月已拥有
 - 荣町 (新竹市)荣町为新竹州新竹市自1935年实施町名改正所成立的行政区之一,共分为三个丁目,位于新竹车站前中华路、东大路、仁义街和护城河之间的街廓。荣町在町名改正前,位于新竹大字下的东
 - 三笑之才子佳人三笑之才子佳人是2010年中国内地拍摄的一部古装喜剧电影。由著名相声演员郭德纲担任导演,郭德纲、姚笛、于谦主演,高圆圆、刘蓓等客串。故事主要讲述江南才子唐伯虎与婢女秋香
 - 亚历山大·格鲁什科亚历山大·维克托罗维奇·格鲁什科(俄语:Александр Викторович Грушко,转写:Alexander Viktorovich Grushko,1955年4月25日-)是俄罗斯外交官,副外长。2012
 - 何岳锺何岳锺(1772年-?),广东广州府新会县人,清朝军事将领,同武进士出身。嘉庆九年(1804年),武举中试。嘉庆十四年(1809年),成武进士,授蓝翎侍卫,乾清门当差。嘉庆十九年,授广东外海水师试验。嘉庆
 - 米彻尔号驱逐舰 (DDG-57)米彻尔号驱逐舰(USS Mitscher (DDG-57))是美国海军阿利·伯克级驱逐舰的第七艘,以海军上将马克·米彻尔命名。米彻尔号驱逐舰于1992年2月12日在密西西比州帕斯卡古拉的英戈尔斯
 - 陆家荡陆家荡是一个位于中国浙江省嘉兴市的淡水湖,面积约为1.54平方千米,属于长江区。它的一级流域为长江流域,二级流域为长江干流水系。
 - 2011 UN632011 UN63,也可以写成2011 UN63,是一颗小的小行星,它的轨道位置接近火星L5(在火星轨道上,位于火星后方60度)处  。2011 UN63是在2009年9月27日的莱蒙山巡天数据中首度被发现的,当时