(Translated by https://www.hiragana.jp/)
C# - 維基百科,自由的百科全書 とべいたり內容

C#

本頁使用了標題或全文手工轉換
維基百科ひゃっか自由じゆうてき百科全書ひゃっかぜんしょ
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]

かたりげん整合せいごう查詢英語えいご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 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). 

外部がいぶ連結れんけつ

[編輯へんしゅう]