(Translated by https://www.hiragana.jp/)
C# - 维基百科,自由的百科全书 とべ转到内容ないよう

C#

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
重定しげさだこうC Sharp 2.0
C#
编程范型结构めんこう对象泛型
语言家族かぞくC
設計せっけいしゃほろ
じつ作者さくしゃほろ
发行时间2000ねん,​24ねんまえ​(2000
とうぜん版本はんぽん
  • 12.0 (2023ねん11月14にち;穩定版本はんぽん)[1]
編輯維基數據鏈接
操作そうさけいWindowsLinuxMac OS XAndroid
許可きょかしょう
ぶんけん扩展めい.cs, .csx
あみdocs.microsoft.com/en-us/dotnet/csharp/ 編輯維基數據鏈接
主要しゅようさく產品さんぴん
.NET.NETかまちMonoDotGNU
衍生ふくかたりげん
CωおめがSpec#えいSpec SharpPolyphonic C#えいPolyphonic C sharp
啟發けいはつげん
C++JavaEiffelModula-3Object Pascal
影響えいきょうげん
Clojure[4]DげんF#Java 5、NemerleVala

C#これほろ推出てきいち种基于.NETかまちかずきさきらいてき.NETてきめんこう对象まとだか编程语言。C#いち种由CC++衍生出来できてきめんこう对象てき编程语言。它在继承CC++强大きょうだいこうのうてきどう时去掉了一些它们的复杂特性,使つかい其成为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#かたりげん規範きはんちゅう[5]

设计

[编辑]

ECMA标准れつてきC#设计标:

  • C#むねざい设计なり为一种「简单、现代、通用つうよう」,以及めんこう对象てきほどじょ设计语言
  • 此种语言てき实现,应提供ていきょう对于以下いか软件工程こうてい要素ようそてき支持しじつよし类型けん查、かず组维检查、はつはじめてき变量引用いんよう检测、动垃圾收集しゅうしゅう(Garbage Collection,ゆび一种記憶體自動释放技术)。软件必须做到強大きょうだい持久じきゅう,并具有ぐゆう较强てき编程せい产力。
  • 此种语言为在分布ぶんぷしき环境ちゅうてき开发提供ていきょう适用てき组件开发应用。
  • 为使ほどじょ容易ようい迁移いた这种语言,みなもとだい码的移植いしょくせいじゅうふん重要じゅうようゆう其是对于些已じゅく悉CC++てきほどじょ员而ごと
  • 对国际化てき支持しじ非常ひじょう重要じゅうよう
  • 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、CC++ てき影響えいきょう

版本はんぽん

[编辑]
版本はんぽん かたりげん規格きかく にち .NETかまち版本はんぽん Visual Studioてき版本はんぽん
ECMA ISO/IEC Microsoft
C# 1.0 2002ねん12月页面そん档备份そん互联网档あん 2003ねん4がつ页面そん档备份そん互联网档あん 2002ねん1がつ页面そん档备份そん互联网档あん 2002ねん1がつ .NET Framework 1.0 Visual Studio .NET 2002
C# 1.1
C# 1.2
2003ねん10がつ页面そん档备份そん互联网档あん 2003ねん4がつ .NET Framework 1.1えい.NET Framework 1.1 Visual Studio .NET 2003
C# 2.0 2006ねん6がつ 2006ねん9がつ页面そん档备份そん互联网档あん 2005ねん9がつ页面そん档备份そん互联网档あん 2005ねん11月 .NET Framework 2.0 Visual Studio 2005
C# 3.0 いや 2007ねん8がつ页面そん档备份そん互联网档あん 2007ねん11月

.NET Framework 2.0 (Except LINQ)[6]
.NET Framework 3.0 (Except LINQ)[6]
.NET Framework 3.5

Visual Studio 2008
Visual Studio 2010
C# 4.0 2010ねん4がつ 2010ねん4がつ .NET Framework 4 Visual Studio 2010
C# 5.0 2017ねん12月页面そん档备份そん互联网档あん 2018ねん12月页面そん档备份そん互联网档あん 2013ねん6がつ页面そん档备份そん互联网档あん 2012ねん8がつ .NET Framework 4.5 Visual Studio 2012
Visual Studio 2013
C# 6.0 いや 草案そうあん页面そん档备份そん互联网档あん 2015ねん7がつ/2016-06-27 .NET Framework 4.6/.NET Core 1.0 Visual Studio 2015
C# 7.0 けん议草あん页面そん档备份そん互联网档あん 2017ねん3がつ .NET Framework 4.6.2 Visual Studio 2017
C# 7.1 いや いや けん议草あん页面そん档备份そん互联网档あん 2017ねん8がつ/2016-08-14 .NET Framework 4.7えい.NET Framework 4.7/.NET Core 2.0 Visual Studio 2017 version 15.3[7]
C# 7.2 いや いや けん议草あん 2017ねん11月 .NET Framework 4.7.1 Visual Studio 2017 version 15.5[8]
C# 7.3 いや いや けん议草あん页面そん档备份そん互联网档あん 2018ねん5がつ/2018-05-30/2018-12-04 .NET Framework 4.7.2/.NET Core 2.1/.NET Core 2.2 Visual Studio 2017 version 15.7[8]
C# 8 いや いや けん议草あん页面そん档备份そん互联网档あん 2019ねん9がつ/2019-09-23/2019-12-03 .NET Framework 4.8/.NET Core 3.0/.NET Core 3.1 Visual Studio 2019 version 16.3[8]
C# 9 いや いや けん议草あん页面そん档备份そん互联网档あん 2020ねん11月 .NET 5 Visual Studio 2019 version 16.8[8]
C# 10[9] いや いや けん议草あん页面そん档备份そん互联网档あん 2021ねん11月 .NET 6 Visual Studio 2022 version 17.0[10]
C# 11[9] いや いや けん议草あん页面そん档备份そん互联网档あん 2022ねん11月 .NET 7 Visual Studio 2022 version 17.4[11]
C# 12[12] いや いや けん议草あん 2023ねん11月 .NET 8 Visual Studio 2022 version 17.8[13]

かたりげん特性とくせい

[编辑]

相對そうたいCC++,這個げんざい許多きょた方面ほうめん進行しんこうりょうげんせい增強ぞうきょう

  • ゆび(Pointer)ただのうよう於不安全あんぜんしきなかだい多數たすう對象たいしょう訪問ほうもん透過とうか安全あんぜんてき引用いんよう实现,以避めん無效むこうてき調ちょうようなみ且有許多きょた算法さんぽうよう於验证溢ゆび针只のうよう於調よう值类がた,以及受垃圾收集しゅうしゅうひかえせいてきたくかん對象たいしょう
  • 對象たいしょう不能ふのうあらわしき釋放しゃくほう代替だいたい為當ためとう存在そんざい引用いんよう透過とうか垃圾回收かいしゅう回收かいしゅう
  • ただ允許いんきょ單一たんいつ繼承けいしょう(single inheritance),ただし一個類可以實現多個せっこう(interfaces)。
  • C#C++さら類型るいけい安全あんぜんだま认的安全あんぜん轉換てんかんかくれ轉換てんかんれい如由たんせいがた轉換てんかんためちょうせいがたしたがえ衍生るい轉換てんかんため基本きほんるい。而接こうぬの尔型どうせいがた,及枚舉型どうせいがた允許いんきょかくれ轉換てんかんそらゆび透過とうか引用いんよう相似そうじ對象たいしょうどうよう定義ていぎ類型るいけいてきかくれ含轉換字かんじだんあらわしきてき確定かくてい不同ふどう於C++てき複製ふくせい構造こうぞう函數かんすう
  • かず声明せいめい語法ごほう不同ふどう("int[] a = new int[5]"而不"int a[5]")。
  • まいくらい於其所在しょざいてき命名めいめい空間くうかんなか
  • C#ちゅうぼつゆうばん(Template),ただしざいC# 2.0ちゅう引入りょう泛型(Generic programming),なみ支持しじいち些C++ばん支持しじてき特性とくせい如泛がたさんすうちゅうてき類型るいけい約束やくそく。另一方面ほうめんひょうたちしき不能ふのうぞうC++ばんちゅうよう於類がたさんすう
  • 屬性ぞくせい支持しじ使用しよう類似るいじ訪問ほうもん成員せいいんてき方式ほうしき調ちょうよう
  • かんせいてき反射はんしゃ支持しじ

C# 2.0てき特性とくせい

[编辑]

针对于.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#泛型类在编译时,さき生成せいせいちゅう间代码IL,通用つうよう类型符号ふごうTただいち个占ざい实例类时,すえ实际すうすえ类型代替だいたいT并由そく时编译器(JIT)生成せいせいほん地代じだい码,其中使用しようりょう实际てきすうすえ类型,ひとしどう于用实际类型うつしてき普通ふつうてき类。

支持しじてき一些特性并不被C++ばん直接ちょくせつ支持しじ如约たば泛型さんすう实现いち个接こう。另一方面ほうめん,C# 支持しじ无类がたてき泛型さんすうぞうJavaちゅうてき泛型,ざいCLIきょ拟机ちゅう,.NET generics使用しよう生成せいせい泛型さんすう,它允许优保存ほぞん类型しんいき[14]

泛型类中,以用where关键对参すう类型实现约束。れい如:

class Node<T, V>
    where T : Stack, IComparable, new(), class
    where V : Stack, struct
{...}

上述じょうじゅつ表示ひょうじTV必须Stack类或其派生はせい类,T必须继承りょうIComparableせっこうゆう无参构造函数かんすう引用いんよう类型;V必须值类がた

泛型仅能作用さようざい类上,也可单独ようざい类的方法ほうほうじょうしょう为“泛型方法ほうほう”。

泛型类的せい态成员变りょうざいしょう同封どうふう闭类间共とおる不同ふどうてきふう闭类间不どもとおる

泛型类中てき方法ほうほうじゅう载,まいりすう类型TVざい运行时确じょうかげ响这个类どおり过编译。C#てき泛型ざい实例てき方法ほうほう调用时检查重载是产生混淆こんこう,而不ざい泛型类本身ほんみ编译时检查。とく别地,とう一般方法与泛型方法具有相同的签名时,かいくつがえ盖泛がた方法ほうほう

せい态類べつ

[编辑]

せい态類べつ不能ふのう实例,并且ただのうゆうせい态成员。这同很多过程语言ちゅうてきかたぎ概念がいねんしょう类似。

迭代

[编辑]

いち种新形式けいしきてき迭代提供ていきょうりょう函数かんすうしき编程ちゅうてき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;
    }
}

注意ちゅういごと项:

  • foreach循环时考虑线ほど安全あんぜんせい不要ふよう试图对被へん历的集合しゅうごう进行removeaddとう操作そうさ
  • IEnumerableせっこうLINQ特性とくせいてき核心かくしんせっこうただゆう实现りょうIEnumerableせっこうてき集合しゅうごう才能さいのう执行しょう关的LINQ操作そうさ如select,whereとう

匿名とくめい方法ほうほう

[编辑]

匿名とくめい方法ほうほう类似于函数式すうしき编程ちゅうてき闭包[15]匿名とくめい方法ほうほうどおり使用しよう delegate 关键创建たく实例らい声明せいめいてきれい如:

delegate void NumberChanger(int n);
 
NumberChanger nc = delegate(int x)
{
    Console.WriteLine("Anonymous Method: {0}", x);
};



public void Foo(object parameter)
{
    // ...

    ThreadPool.QueueUserWorkItem(delegate
    {
        // anonymous delegates have full access to local variables of the enclosing method
        if(parameter == ...)
        { 
            // ... 
        }

        // ...
    });
}

ゆだねたくてき协变ぎゃく

[编辑]

ゆだねたく签名てき协变ぎゃく[16]

属性ぞくせい访问以被单独设置访问级别

[编辑]

れい

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てきいち部分ぶぶん,它的しん特性とくせい灵感函数かんすうしき编程语言,如:HaskellML,并广泛地引入りょうLanguage Integrated Query(LINQ)しきいた通用つうようげん運行うんこうちゅうe.[17]

Linq

[编辑]

语言集成しゅうせい查询英語えいごLanguage Integrated Query,缩写:LINQ):[18] 上下じょうげ文相ぶんしょう关关键字"from, where, select"可用かよう于查询SQL、XML、集合しゅうごうとう。这些标识ざいLINQ上下じょうげ文中ぶんちゅうさく为关键字,ただし它们てき增加ぞうかかいやぶ坏原ゆうてきめいfromwhereある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[19]

匿名とくめい類型るいけい

[编辑]
var x = new { Name = "James" };

局部きょくぶ变量类型推断すいだん

[编辑]

局部きょくぶ变量类型推断すいだん

var x = new Dictionary<string, List<float>>();

ひとしどう

Dictionary<string, List<float>> x = new Dictionary<string, List<float>>();

它只いち语法とう,这个特性とくせい匿名とくめい类型声明せいめい时所需要じゅよう

Lambdaひょう达式

[编辑]

Lambdaひょう达式はこしき名稱めいしょうてき物件ぶっけん方法ほうほうざいほどしきげんちゅうてきひょうたち語法ごほう):

listOfFoo.Where(
    delegate(Foo x)
    {
        return x.Size > 10; 
    }
)
うつしさく
listOfFoo.Where(x => x.Size > 10);

编译こぼし译Lambdaひょう达式为强类型たくあるつよ类型おもて达式树

注意ちゅういごと项:

  • 如果ただゆういち个参すう省略しょうりゃくくくごう(),れい如 item=>{Console.WriteLine("ただゆういち个参すう{0}てきLambdaひょう达式",item); };
  • 如果ただゆう一个返回值的语句,省略しょうりゃくはなくくごう{}、return关键ぶんごうれい如 item => {return item % 2 == 0;};あらためうつしなり:item =>item %2 == 0;
  • Lambdaひょう达式分配ぶんぱい给Func,ActionあるPredicateたく

动化属性ぞくせい

[编辑]

编译はた生成せいせい私有しゆう变量适当てきgetter(get访问かずsetter(set访问),如:

public string Name
{
    get; 
    set; 
}

扩展方法ほうほう

[编辑]

扩展方法ほうほうのう够使现有てき类型添加てんか方法ほうほう,而无需创けんしんてき派生はせい类型、じゅうしん编译ある以其它方しきおさむあらため原始げんし类型。

使用しようひらけてん方法ほうほう,必须ざい一个非嵌套、泛型てきせい态类ちゅうてい义一个静态方ほう方法ほうほうだい一个参数必须附加this关键さく为前缀,だい一个参数不能有其它修饰符(如refあるものout),这个方法ほうほうはた编译添加てんかいた该thisてき类型ちゅう

public static class IntExtensions
{
    public static void PrintPlusOne(this int x) 
    {
        Console.WriteLine(x + 1);
    }
}
 
int foo = 0;
foo.PrintPlusOne();

注意ちゅういごと项:

  • 扩展方法ほうほうただかい增加ぞうか编译てき工作こうさくただしかいかげ响程じょ运行性能せいのうよう继承てき方式ほうしき为一个类型增加特性反而会影响性能)
  • 如果ばららいてき中有ちゅうういち个方ほう,跟扩てん方法ほうほういち样,么扩てん方法ほうほうかい调用,编译也不かい提示ていじ

分部わけべ方法ほうほう

[编辑]

まこと许代码生成せいせい生成せいせい方法ほうほう声明せいめいさく为扩てんてん,如果有人ゆうじんざい另一个部分类实现了它才会被包含于原代码编译。[20]

  1. 分部わけべ方法ほうほう(Partial methods)必须てい义在分部わけべ类(partial classes)ちゅう
  2. てい义分方法ほうほう需要じゅようようpartial做修饰符
  3. 分部わけべ方法ほうほう一定总是有执行内容的,也就说定义的方法ほうほう以一句操作语句都没有
  4. 分部わけべ方法ほうほうかえしかい值必须是void
  5. 分部わけべ方法ほうほう以是せい态(static)方法ほうほう
  6. 分部わけべ方法ほうほう包含ほうがんさんすうまいりすう包含ほうがん以下いかおさむ饰词:this,ref,params
  7. 分部わけべ方法ほうほう必须私有しゆう(private)方法ほうほう

れい

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类型

[编辑]

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[5, 5].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てき特性とくせい

[编辑]
  1. C# Evolution Matrix
  2. Async Feature (补充: asyncawaitいち对语ほうとうまこと许开发人员非常ひじょう轻松てき调用もと于TASKてき异步编程)async-await关键并不かいしんてき创建一个线程池任务,完成かんせい这个动作赖于调用方法ほうほうちゅうてき函数かんすう。这一点在てんざい许多C#的中てきちゅう文教ぶんきょうほどちゅうゆるがせりゃく,导致许多がく习的新手あらて误以为await关键かい直接ちょくせつ创建一个新的线程池任务。
  3. Caller Information

C# 6.0てき特性とくせい

[编辑]
  1. ただ讀 Auto 屬性ぞくせい
  2. Auto 屬性ぞくせいはつはじめ設定せっていしき
  3. 使用しよう靜態せいたい
  4. Null - 條件じょうけん運算うんざん
  5. くし插值
  6. 例外れいがい狀況じょうきょうふるいせん條件じょうけん
  7. nameof 運算うんざんしき
  8. Catch Finally かたまりちゅうてき Await
  9. 索引さくいんはつはじめ設定せっていしき
  10. 集合しゅうごうはつはじめ設定せっていしきてき擴充かくじゅう方法ほうほう
  11. あらためすすむてき解析かいせき

おもて达式主体しゅたい(Expression-bodied)よう于类てき方法ほうほうただ读属せい

[编辑]
using System;

public class Person
{
   public Person(string firstName, string lastName)
   {
      fname = firstName;
      lname = lastName;
   }

   private string fname;
   private string lname;

   public override string ToString() => $"{fname} {lname}".Trim(); //かえしかい值类がたstring
   public void DisplayName() => Console.WriteLine(ToString()); //かえしかい值类がたvoid
   public string Name => $"{fname} {lname}".Trim();//ただ读属せい
}

C# 7.0てき特性とくせい

[编辑]

out 變數へんすう

[编辑]

のう直接ちょくせつ宣告せんこく一個變數在它要傳入的地方,とうなりいち out てき引數ひきすう[21]

弃元

[编辑]

もと组/对象てきかい构:

var tuple = (1, 2, 3, 4, 5);
(_, _, _, _, var fifth) = tuple;

使用しよう is/switch てきしきひきはい

var obj = CultureInfo.CurrentCulture.DateTimeFormat;
switch (obj)
{
case IFormatProvider fmt:
    Console.WriteLine($"{fmt} object");
    break;
case null:
    Console.Write("A null object reference");
    break;
case object _:
    Console.WriteLine("Some object type without format information");
    break;
}

if (obj is object _) { ... }

具有ぐゆう out さんすうてき方法ほうほうてき调用:

var point = new Point(10, 10);
// ただよう x, 关心 y
point.GetCoordinates(out int x, out _);

作用さよう域内いきない独立どくりつ使用しよう场景:

void Test(Dto dto)
{
    _ = dto ?? throw new ArgumentNullException(nameof(dto));
}

おもて达式主体しゅたい(Expression-bodied)よう于类てき属性ぞくせい、构造、终结索引さくいん

[编辑]
using System;
public class Location
{
   private string locationName;

   public Location(string name) => Name = name; //构造函数かんすう

   public string Name
   {
      get => locationName;   //get属性ぞくせい
      set => locationName = value;  //set属性ぞくせい
   }

   public override string ToString() => GetType().Name;

   ~Location() => Console.WriteLine($"The {ToString()} finalizer is executing."); //析构函数かんすう

   private string[] types = { "Baseball", "Basketball", "Football",
                              "Hockey", "Soccer", "Tennis",
                              "Volleyball" };

   public string this[int i] 
   {
      get => types[i];            //索引さくいん
      set => types[i] = value;
   }
}

C# 7.1てき特性とくせい

[编辑]
  1. async``Main方法ほうほう
  2. defaultつね值運算式さんしき
  3. 推斷すいだんてき tuple 項目こうもく名稱めいしょう

C# 7.2てき特性とくせい

[编辑]
  1. 具備ぐびじつ值型べつてき參考さんこう語意ごい
  2. おけめい引數ひきすう
  3. かず值常值中てきまえおけそこせん
  4. private protected そん修飾しゅうしょく

C# 8.0てき特性とくせい

[编辑]
  1. そら引用いんよう类型
  2. await yield return异步かえしかいてき迭代
  3. Index 索引さくいん类型Range间类がた
  4. まこと许在声明せいめいせっこう时为せっこうなり提供ていきょうだま认实现
  5. 递归てきしきひきはい
  6. おもて达式形式けいしきてきSwitch关键
  7. ざい编译做类がた推断すいだんてきじょう况下,まこと许进いち省略しょうりゃく类型声明せいめい

C# 9てき特性とくせい

[编辑]

しんてき「Record」類型るいけい

[编辑]

记录类型, いち引用いんよう类型, だま认是不可ふか变的。 记录类型てき相等そうとう判断はんだん以通过引ようあるもの结构进行判断はんだんてき

  • 优点:记录类型轻量级的不可ふか变类がた以减しょう大量たいりょうてきだい码, 以按あきら结构引用いんよう进行较;
  • 缺点けってん需要じゅよう实例大量たいりょうてき对象;
// だま不可ふか变的记录类型
public record Person(string Name, int Age);

// 变记录类がた
public record MutablePerson(string Name, int Age)
{
    public string Name { get; set; } = Name;
    public int Age { get; set; } = Age;
}
 
var person1 = new Person("Alice", 40);
var person2 = new Person("Alice", 40);
 
Console.WriteLine(person1 == person2); // True 结构しょうどう
Console.WriteLine(person1.Equals(person2)); // True 结构しょうどう
Console.WriteLine(ReferenceEquals(person1, person2)); // False, 引用いんよう不同ふどう
 
// あらため变默认的记录! --> 创建いち个新てき记录。
var person3 = person1 with { Age = 43 };
Console.WriteLine(person3 == person1); // False 结构不同ふどう
 
// かい构 (Destruct) いち个记录, はた记录てき属性ぞくせいひっさげ为本变量
var (name, age) = person3;
 
var person4 = new MutablePerson("Alice", 40);
person4.Age = 43;
 
// 记录类型也可以被继承
public record Citizen(string Name, int Age, string Country) : Person(Name, Age);
var citizen = new Citizen("Alice", 40, "China");
Console.WriteLine(person1 == citizen); // False 类型不同ふどう

「init」そん

[编辑]

initそん表示ひょうじ該屬せい所屬しょぞく類型るいけい僅能ざいけん構函しき(Constructor)ちゅうある屬性ぞくせいはつはじめしき子中こなか其值,如果嘗試ざい其他地方ちほう設定せってい該屬せいてき值,ざいへんやく便びんかい遭編やく阻止そし

はんれい如下:ざい這個はんれいちゅう建立こんりゅうりょういちStudent類型るいけいなみ且屬せいStudentNameあずかStudentIDただのうざいはつはじめ其值。

public class Student
{
	public Student()
    {
	}
	
	public Student(string studentName,string studentID)
	{
		StudentName = studentName;
		StudentID = studentID;
	}
	
	public string StudentName { get; init; } = "Default Name";
	public string StudentID { get; init; } = "00000000";
}

如果ざい此時せんうつし以下いかほどしき碼:

Student DemoStudent = new Student();
DemoStudent.StudentName = "Test Name";

へんやく便びんかい無法むほうへんやくなみ且擲かい錯誤さくご

而如はてよう建立こんりゅう學生がくせい名稱めいしょうため「Test Name」,學生がくせいIDため「0001」てき學生がくせいのり需要じゅよううつしなり

Student DemoStudent = new Student() //物件ぶっけんはつはじめ運算うんざんしき
{
    StudentName = "Test Name";
    StudentID = "0001"
};

ある

Student DemoStudent = new Student("Test Name","0001"); //藉由類型るいけいてきけん構式はつはじめStudentName以及StudentID。

さい上層じょうそう陳述ちんじゅつしきあるしょう顶级语句

[编辑]

ざい以前いぜんてき版本はんぽん開發かいはつしゃざいせんうつしさい上層じょうそう陳述ちんじゅつしき(如Program.cs)ほどしき碼時,需要じゅよう包含ほうがんかんせいてきnamespaceあずかclass構,いん此如はてようせんうつしHello Worldほどしきほどしき碼就かい

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

ただしざいC# 9これさい上層じょうそう陳述ちんじゅつしきてきほどしき碼不需要じゅよう包含ほうがんnamespace以及class,しょう其簡ため

using System;

Console.WriteLine("Hello World!");
//あるもの简化为いちぎょう语句:
System.Console.WriteLine("Hello World!");

注意ちゅういいち个程じょちゅうただのうゆう一个文件使用顶级语句, 并且顶级语句必须命名めいめいそら间或类型てい义之まえ

lambda弃元さんすう

[编辑]
Func<int, int, int> zero = (_, _) => 0;
Func<int, int, int> func = delegate (int _, int _) { return 0; };

ざい C# 9 まえそく便びん使用しようてき Lambda まいり数也かずや需要じゅよう给它命名めいめい。C# 9 支持しじ弃元さんすういち方面ほうめん简化りょう命名めいめい,另一方面也节省了内存分配。さら重要じゅうようてき它使とく编程てき图更あかり确,让人一看就知道这个参数是不用的,增强ぞうきょうりょうだい码的读性维护せい

ただのうはつはじめてき设置

[编辑]

Init only setters,ただのうどおり过对ぞうはつはじめ进行赋值てき属性ぞくせい

public class InitDemo
{
    public string Start { get; init; }
    public string Stop { get; init; }
}
 
// initDemo.Start = "Now"; // Error
// initDemo.End = "Tomorrow"; // Error
 
var initDemo = new InitDemo
{
    Start = "Now",
    Stop = "Tomorrow"
};

函数かんすうゆび

[编辑]

使用しよう delegate* 声明せいめい函数かんすうゆび针。

unsafe class FunctionPointer {
 static int GetLength(string s) => s.Length;
 delegate*<string, int> functionPointer = &GetLength;
}
 
public void Test() {
 Console.WriteLine(functionPointer("test")); // 4;
}

とべ过本はつはじめ

[编辑]
[System.Runtime.CompilerServices.SkipLocalsInit]
static unsafe void DemoLocalsInit() {
 int x;
 // 注意ちゅうい, x ぼっゆうはつはじめ, 输出结果确定;
 Console.WriteLine(*&x);
}

原生げんせい整数せいすう类型

[编辑]

两个しんてき整数せいすう类型 nint nunit , 宿主しゅくしゅつくえ以及编译设定。

协变かえしかい类型

[编辑]

协变かえしかい类型为重うつし方法ほうほうてきかえしかい类型提供ていきょうりょう灵活せいくつがえ方法ほうほう以返かい被覆ひふく盖的もと础方法的ほうてきかえしかい类型派生はせいてき类型。

class Person
{
    public virtual Person GetPerson() { return new Person(); }
}

class Student : Person
{
    public override Student GetPerson() { return new Student(); }
}

かたぎ块初はじめだい

[编辑]

ModuleInitializerAttribute 为组けん (assembly) てい义初はじめだい码, 当初とうしょはじめ/载时执行, 以类类的せい态构づくり函数かんすうただし组件级别てき

  • 必须せい态的、无参すうてき、无返かい值的方法ほうほう
  • 不能ふのう范型方法ほうほう,也不能ふのう包含ほうがんざい范型类中;
  • 不能ふのう私有しゆう函数かんすう,必须こう开 (public) あるもの内部ないぶ (internal) てき函数かんすう

せい态 lambda ひょう达式

[编辑]

static おさむ饰符添加てんかいた lambda ひょう达式ある匿名とくめい方法ほうほう 。这将无法获局变量ある实例じょう态,从而防止ぼうし意外いがい获其变量。

分部わけべ方法ほうほう扩展

[编辑]

うつりじょりょう分部わけべ方法ほうほうてきじゅつげんせい

  • 必须具有ぐゆう void かえしかい类型。
  • 不能ふのう具有ぐゆう out さんすう
  • 不能ふのう具有ぐゆうにんなん访问せい(隐式 private )。

はつはじめひょう达式てき简化

[编辑]

如果创建对象てき类型やめ时,以在newひょう达式ちゅう省略しょうりゃく该类がた

Point p = new(1, 1);
Dictionary<string, int> dict = new();
 
Point[] points = { new(1, 1), new (2, 2), new (3, 3) };
var list = new List<Point> { new(1, 1), new(2, 2), new(3, 3)};

ざい本地ほんじ函数かんすうじょう添加てんか标记

[编辑]
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
namespace CoreApp2
{  
    class Program
    {
        static void Main(string[] args)
        {
            [Conditional("DEBUG")]
            static void DoSomething([NotNull] string test)
            {
                System.Console.WriteLine("Do it!");
            }
            DoSomething("Doing!");
        }
   }
}

GetEnumerator 扩展

[编辑]

以为任意にんい类型添加てんかいち个 GetEnumerator 扩展方法ほうほうかえしかいいち个 IEnumerator あるもの IAsyncEnumerator 实例, 从而ざい foreach 循环ちゅう使用しよう

using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace CoreApp2
{
    public static class Extensions
    {
        public static IEnumerator<T> GetEnumerator<T>(this IEnumerator<T> enumerator) => enumerator;
    }

    class Program
    {
        static void Main(string[] args)
        {
            IEnumerator<string> enumerator = new Collection<string> {"A", "B", "C"}.GetEnumerator();
            foreach (var item in enumerator)
            {
                Console.WriteLine(item);
            }
        }
    }
}

しきひきはい增强ぞうきょう

[编辑]

Type patterns 类型ひきはい判断はんだん一个变量的类型

object obj = new int();
var type = obj switch
{
    string => "string",
    int => "int",
    _ => "obj"
};
Console.WriteLine(type); // int

Relational patterns 关系ひきはい

class Person
{ 
    public string name; 
    public int age; 
    public Person(string a, int b) { name = a;age = b; }
    public void Deconstruct(out string a,out int b){a = name;b = age; }
}

class Program
{        
    static void Main(string[] args)
    {
        var person1 = new Person("Alice", 40);
        var inRange = person1 switch
        {
            (_, < 18) => "less than 18",
            (_, > 18) => "greater than 18",
            (_, 18) => "18 years old!"
        };
        Console.WriteLine(inRange); // greater than 18
    }
}

Conjunctive and patterns 逻辑あいひきはい

// And pattern
var person1 = new Person("Alice", 40);
var ageInRange = person1 switch
{
    (_, < 18) => "less than 18",
    ("Zhang Zhimin", _) and (_, >= 18) => "Alice is greater than 18"
};
Console.WriteLine(ageInRange); // Alice is greater than 18

Disjunctive or patterns 逻辑析取ひきはい

// Or pattern
var person1 = new Person("Alice", 40);
var ageInRange = person1 switch
{
    (_, < 18) => "less than 18",
    (_, 18) or (_, > 18) => "18 or greater"
};
Console.WriteLine(ageInRange); // 18 or greater

Negated not patterns 逻辑ひきはい

// Not pattern
var person1 = new Person("Alice", 40);
var meOrNot = person1 switch
{
    not ("Alice", 40) => "Not me!",
    _ => "Me :-)"
};
Console.WriteLine(meOrNot); // Me :-)

Parenthesized patterns 带括ごうてき优先级匹はい

// Parenthesized patterns
var is10 = new IsNumber(true, 10);
var n10 = is10 switch
{
    ((_, > 1 and < 5) and (_, > 5 and < 9)) or (_, 10) => "10",
    _ => "not 10"
};
Console.WriteLine(n10); // 10

C# 10てき特性とくせい

[编辑]

record struct

[编辑]

かい决了 record ただのう给 class 而不能ふのう给 struct ようてき问题:

record struct Point(int X, int Y);

sealed record ToString 方法ほうほう

[编辑]

以把 record さとてき ToString 方法ほうほう标记なる sealed

struct 无参构造函数かんすう

[编辑]

无参构造函数かんすう使とくnew struct() かず default(struct) てき语义いち

ようwith创建しんてき匿名とくめい类型对象

[编辑]
var x = new { A = 1, B = 2 };
var y = x with { A = 3 };

这里 y.A しょうかい 3 。

全局ぜんきょくてき using

[编辑]

以给せい个项启用 using,需要じゅようごと个文けんうつしいち份。

ぶんけん范围てき namespace

[编辑]

以前いぜんうつし namespace 还得带一层大くくごう。现在如果一个文件里只有一个 namespace てき话,直接ちょくせつざいぶんけん开头うつしnamespace MyNamespace;

つねりょうくし插值

[编辑]
const string x = "hello";
const string y = $"{x}, world!";

lambdaてきあらため

[编辑]

lambda 以带 attributes

[编辑]
f = [Foo] (x) => x; // 给 lambda 设置
f = [return: Foo] (x) => x; // 给 lambda かえしかい值设おけ
f = ([Foo] x) => x; // 给 lambda さんすう设置

指定していかえしかい值类がた

[编辑]

此前 C# てき lambda かえしかい值类がたもたれ推导,C# 10まこと许在さん数列すうれつひょうぜん显式指定してい lambda かえしかい值类がた

f = int () => 4;

支持しじ ref 、in 、out とうおさむ

[编辑]
f = ref int (ref int x) => ref x; // かえしかいいち个参すうてき引用いんよう

头等函数かんすう

[编辑]

函数かんすう以隐しき转换到 delegate,于是函数かんすうじょうます为头とう函数かんすう(first function):

void Foo() { Console.WriteLine("hello"); }
var x = Foo;
x(); // hello

自然しぜんたく类型

[编辑]

lambda 动创けん自然しぜんたく类型,于是さい需要じゅよううつし类型:

var f = () => 1; // Func<int>
var g = string (int x, string y) => $"{y}{x}"; // Func<int, string, string>
var h = "test".GetHashCode; // Func<int>

CallerArgumentExpression

[编辑]

使用しようCallerArgumentExpression这个attribute,编译かい动填たかし调用さんすうてきひょう达式くしれい如:

void Foo(int value, [CallerArgumentExpression("value")] string? expression = null)
{
    Console.WriteLine(expression + " = " + value);
}

とう你调よう Foo(4 + 5) 时,かい输出 4 + 5 = 9。这对测试かまち极其有用ゆうよう

tuple てき混合こんごうてい义和使用しよう

[编辑]
int y = 0;
(var x, y, var z) = (1, 2, 3);

于是 y 就变なり 2 りょうどう时还创建りょう两个变量 x z,ぶん别是 1 3 。

せっこう支持しじ抽象ちゅうしょうせい态方ほう

[编辑]

.NET 6ちゅう这个特性とくせい为preview特性とくせい

泛型 attribute

[编辑]

ざい方法ほうほうじょう指定してい AsyncMethodBuilder

[编辑]

ざい方法ほうほううえよう [AsyncMethodBuilder(...)],らい使用しよう自己じこ实现てき async method builder,代替だいたい带的 Task あるもの ValueTask てき异步方法ほうほう构造ゆうじょ于实现零开销てき异步方法ほうほう

line 指示しじ支持しじ行列ぎょうれつ范围

[编辑]

以前いぜん #line ただのうようらい指定してい一个文件中的某一行,现在指定してい行列ぎょうれつ范围:

#line (startLine, startChar) - (endLine, endChar) charOffset "fileName"
// 如 #line (1, 1) - (2, 2) 3 "test.cs"

はま套属せいしきひきはいあらため

[编辑]

以前いぜんざいひきはいはま套属せいてき时候需要じゅよう这么うつし

if (a is { X: { Y: { Z: 4 } } }) { ... }

现在ただ需要じゅよう简单てき

if (a is { X.Y.Z: 4 }) { ... }

あらため进的くし插值

[编辑]

实现接近せっきんれい开销てきくし插值。

Source Generator v2

[编辑]

包括ほうかつきょう类型てきだい码构けん,以及增量ぞうりょう编译てき支持しじとう

C# 11てき特性とくせい[22]

[编辑]

泛型属性ぞくせい

[编辑]

C# 11 开始支持しじ属性ぞくせい(attribute)为泛がた类,そくまこと声明せいめいもと类为System.Attributeてき泛型类:

public class GenericAttribute<T> : Attribute { }

せい态接こう方法ほうほう

[编辑]

C# 11 开始まこと许接口中くちじゅうてい义静态方ほう包括ほうかつ运算じゅう载方ほう),实现该接こうてき类必须包含ほうがん该静态方ほう[23]

public interface IGetNext<T> where T : IGetNext<T>
{
    static abstract T operator ++(T other);
}

无符ごうみぎうつり运算 >>>

[编辑]

しんぞう无符ごうみぎうつり运算 >>>よう于对带符ごうすう进行逻辑みぎうつり[24]

泛型数学すうがく支持しじ

[编辑]

对泛がた及其对象进行数学すうがく操作そうさてき支持しじもと于静态接こう方法ほうほう特性とくせい .NET 8.0 おこりざいSystem命名めいめいそら间中提供ていきょう数学すうがく运算しょう关泛がたせっこう,以支持しじ泛型てき运算操作そうさ[25]

public static TResult Sum<T, TResult>(IEnumerable<T> values)
    where T : INumber<T>
    where TResult : INumber<TResult>
{
    TResult result = TResult.Zero;

    foreach (var value in values)
    {
        result += TResult.Create(value);
    }

    return result;
}

くしない插中てき换行

[编辑]

まこと许内插字くしちゅう{あずか}内的ないてきぶんほんまたが个行

原始げんしくしぶんほん

[编辑]

原始げんしくしぶんほん""" 开始并以 """ 结束,まこと许多ぎょうくしわか为多ぎょうくし则以单独てきいちぎょう """ 结束,且字くしてき缩进以末尾まつびてき """ てきおこりはじめ位置いち为基じゅん原始げんしくしぶんほん进行にんなん转义操作そうさただしまこと许字くしない插(开头てき $ 数量すうりょう代表だいひょうない插所需要じゅようてきはなくくごうすう[26]

var x = 1;
var y = 2;
var code1 = """int i = 0;""";
var code2 = $"""int x = {x};""";
var code3 = $$"""
    #include <stdio.h>
    int main(void) {
        const char *s = "{y} = {{y}}";  // {y} = 2
        return 0;
    }
    """;
Console.WriteLine($"code1:\n{code1}\n");
Console.WriteLine($"code2:\n{code2}\n");
Console.WriteLine($"code3:\n{code3}\n");

UTF-8 くし字面じめんりょう

[编辑]

以对くし字面じめんりょう指定してい u8 きさき缀来指定してい UTF-8 编码てきくし字面じめんりょう,其类がたReadOnlySpan<byte>[27]

れつひょうしき

[编辑]

使用しよう[]以定义列ひょうしきようしきひきはい

int[] numbers = { 1, 2, 3 };

Console.WriteLine(numbers is [1, 2, 3]);             // True
Console.WriteLine(numbers is [1, 2, 4]);             // False
Console.WriteLine(numbers is [1, 2, 3, 4]);          // False
Console.WriteLine(numbers is [0 or 1, <= 2, >= 3]);  // True

かずIntPtr UIntPtr

[编辑]

C# 11 おこり nint nuint 类型てき别名ぶん别为 IntPtr UIntPtr(C# 9 ちゅう它们仅被认为相似そうじてき[28])。

あらため进了方法ほうほう组向たくてき转换

[编辑]

优化りょう方法ほうほう组向たく转换てき性能せいのうれい如下じゅつだい码中,ざい C# 11 まえSum SumMethodGroup 性能せいのうさらだか[29]

static readonly List<int> Numbers = Enumberable.Range(0, 100).ToList();

public int Sum()
{
    return Numbers.Where(x => Filter(x)).Sum(); // <- faster
}

public int SumMethodGroup()
{
    return Numbers.Where(Filter).Sum();         // <- slower
}

static bool Filter(int number)
{
    return number > 50;
}

ほどじょてき执行

[编辑]

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)。现在ゆう一些独立的实现正在进行,包括ほうかつ

しめせれい

[编辑]

C# てきHello Worldほどしき

[编辑]

下面かめんいちざい命令めいれいれつじょう輸出ゆしゅつHello Worldまとしょうほどじょ,這種ほどじょ通常つうじょう作為さくい開始かいし學習がくしゅうほどじょげんてきだいいち驟:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

实现

[编辑]

ほろ软正ざい引领开源参考さんこう C# 编译工具こうぐしゅうてき开发。 だいいち个编译器 Roslyn编译なりちゅう间语ごと(IL),だい个编译器 RyuJIT,[30] いち个 JIT(そく时)编译,它是动态てき,进行动态优化并编译将 IL 转换为 CPU ぜんはしてきほんつくえだい码。[31] RyuJIT 开源てきよう C++ 编写。[32] Roslyn 完全かんぜんよう たくかんだい (C#)编写てきやめ经开放并且こうのう以 API てき形式けいしき现。よし此,它使开发じん员能够创けんじゅう构和诊断工具こうぐ[2][33] かんかた实现てき两个ぶんささえ .NET Framework(闭源,仅限 Windows) .NET Core(开源,またが平台ひらだい);它们さい融合ゆうごう为一个开げん实现:.NET 5.0。[34] ざい .NET Framework 4.6 ちゅうしんてき JIT 编译だいりょう前者ぜんしゃ[30][35]

其他 C# 编译(其中いち包括ほうかつ公共こうきょう语言もと础结构 .NET 类库てき实现):

  • ほろ軟的Rotor项目(Rotor Project,目前もくぜんたたえためShared Source Common Language InfrastructureえいShared Source Common Language Infrastructure),提供ていきょうりょう通用つうよう语言运行库Common Language RuntimeてきさくあずかC# へんやくただしShared Source Common Language Infrastructureざい2006ねんてき2.0はん停止ていしりょう
  • よしMicrosoft贊助さんじょてきMono 项目提供ていきょうりょうC# へんやく,它提供ていきょうりょういち个开げん C# 编译いち个完せいてき CLI 开源实现,同時どうじ接近せっきん百分之百地實作了.NET Framework类库。而Mono後來こうらい衍伸ゆかりほろ認可にんかてきだいさんぽう套件Xamarin
  • Dot GNU せんあん(现已とま产)也提供ていきょうりょういち自由じゆう版本はんぽんてきC# へんやく,也提供ていきょうりょう.NET Framework类库てきさく

ゆう戏引擎 Unity 使用しようC# さく为其主要しゅよう脚本きゃくほん语言。よし于Microsoft 捐赠りょう 24,000 もとGodot ゆう戏引擎实现了いち个可选的 C# かたぎ块。

参考さんこう文献ぶんけん

[编辑]
  1. ^ Announcing C# 12. [2023ねん11月18にち]. 
  2. ^ 2.0 2.1 The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs.: dotnet/roslyn. November 13, 2019 [2021-08-16]. (原始げんし内容ないようそん于2021-02-22) –どおり过GitHub. 
  3. ^ CoreCLR is the runtime for .NET Core. It includes the garbage collector, JIT compiler, primitive data types and low-level classes.: dotnet/coreclr. November 13, 2019 [2021-08-16]. (原始げんし内容ないようそん于2019-10-14) –どおり过GitHub. 
  4. ^ Rich Hickey Q&A by Michael Fogus. [2017-01-11]. 原始げんし内容ないようそん档于2017-01-11. 
  5. ^ C# Language Specification (PDF) 4th. Ecma International. June 2006 [2012-01-26]. (原始げんし内容ないよう (PDF)そん档于2012-12-02). 
  6. ^ 6.0 6.1 Using C# 3.0 from .NET 2.0. Danielmoth.com. 2007-05-13 [2012ねん10がつ4にち]. (原始げんし内容ないようそん档于2012-09-29). 
  7. ^ そん副本ふくほん. [2018-09-06]. (原始げんし内容ないようそん于2018-01-22). 
  8. ^ 8.0 8.1 8.2 8.3 そん副本ふくほん. [2018-09-06]. (原始げんし内容ないようそん于2018-01-22). 
  9. ^ 9.0 9.1 What's new in C# 10. docs.microsoft.com. [2021-11-10]. (原始げんし内容ないようそん于2022-02-08) 美国びくにえい语). 
  10. ^ Visual Studio 2022 version 17.0 Release Notes. docs.microsoft.com. [2022-06-24]. (原始げんし内容ないようそん于2022-08-06). 
  11. ^ DeDiv-VR. Visual Studio 2022 version 17.4 Release Notes. learn.microsoft.com. 2024-06-11 [2024-07-15] 美国びくにえい语). 
  12. ^ BillWagner. What's new in C# 12. learn.microsoft.com. 2024-06-04 [2024-07-15] 美国びくにえい语). 
  13. ^ Murphy, Adrian. Visual Studio 17.8 now available!. Visual Studio Blog. 2023-11-14 [2024-07-15] 美国びくにえい语). 
  14. ^ An Introduction to C# Generics. [2020-09-25]. (原始げんし内容ないようそん于2019-09-24). 
  15. ^ Anonymous Methods (C#). [2008-10-24]. (原始げんし内容ないようそん于2008-04-17). 
  16. ^ Covariance and Contravariance in Delegates (C#). [2008-10-24]. (原始げんし内容ないようそん于2008-10-12). 
  17. ^ Tim Anderson. C# pulling ahead of Java - Lead architect paints rosy C# picture. Reg Developer. The Register. 2006-11-14 [2007-01-20]. (原始げんし内容ないようそん于2007-01-21). 
  18. ^ LINQ. Microsoft MSDN. 2007 [2007-08-13]. (原始げんし内容ないようそん档于2007-01-16) えい语). 
  19. ^ The Mellow Musings of Dr. T : What is a collection?. [2008-10-24]. (原始げんし内容ないようそん于2008-12-18). 
  20. ^ Partial Methods. [2007-10-06]. (原始げんし内容ないようそん于2007-10-16). 
  21. ^ 一覽いちらん C# 7.0 ちゅうてきしんこうのう. [2016-09-14]. (原始げんし内容ないようそん于2018-10-02). 
  22. ^ C# 11 ちゅうてきしんぞうこうのう. learn.microsoft.com. [2024-3-19]. (原始げんし内容ないようそん于2024-03-19) ちゅうぶん中国ちゅうごくだい陆)). 
  23. ^ 教程きょうてい探索たんさく C# 11 こうのう - せっ口中くちじゅうてきせい态虚拟成员. learn.microsoft.com. [2024-3-20]. (原始げんし内容ないようそん于2024-03-19) ちゅうぶん中国ちゅうごくだい陆)). 
  24. ^ くらい运算うつり运算(C# 参考さんこう. learn.microsoft.com. [2024-3-20]. (原始げんし内容ないようそん于2024-03-19) ちゅうぶん中国ちゅうごくだい陆)). 
  25. ^ Preview Features in .NET 6 – Generic Math. devblogs.microsoft.com. [2024-3-20]. (原始げんし内容ないようそん于2024-02-01) 美国びくにえい语). 
  26. ^ C# ほどじょ设计もと. docs.eesast.com. [2024-3-20]. (原始げんし内容ないようそん于2024-03-19) ちゅうぶん中国ちゅうごくだい陆)). 
  27. ^ Utf8 Strings Literals. learn.microsoft.com. [2024-3-20]. (原始げんし内容ないようそん于2024-03-04) 美国びくにえい语). 
  28. ^ Introducing C# 11: Numeric IntPtr and UIntPtr. anthonygiretti.com. [2024-3-20]. (原始げんし内容ないようそん于2023-11-30) 美国びくにえい语). 
  29. ^ C# 11 - Improved Method Group. prographers.com. [2024-3-20]. (原始げんし内容ないようそん于2023-09-30) 美国びくにえい语). 
  30. ^ 30.0 30.1 The RyuJIT transition is complete!. microsoft.com. June 19, 2018 [July 20, 2021]. (原始げんし内容ないようそん于July 19, 2019). 
  31. ^ Managed Execution Process. microsoft.com. [July 20, 2021]. (原始げんし内容ないようそん于December 23, 2017). 
  32. ^ coreclr/src/jit/. github.com. [July 20, 2021]. (原始げんし内容ないようそん于January 9, 2019). 
  33. ^ C# Guide. docs.microsoft.com. [2017-11-20]. (原始げんし内容ないようそん于2022-08-13). 
  34. ^ 5.0.8. microsoft.com. [July 20, 2021]. (原始げんし内容ないようそん于April 23, 2020). 
  35. ^ Mitigation: New 64-bit JIT Compiler. microsoft.com. [July 20, 2021]. (原始げんし内容ないようそん于April 5, 2018). 

外部がいぶ連結れんけつ

[编辑]