泛型:透過參數化類型來實現在同一份程式碼上操作多種資料型別。利用「參數化類型」將型別抽象化,從而實現靈活的複用。
範例程式碼:
class PRogram
{
static void int obj = 2;
Test
Console.WriteLine("int:" + test.obj);
Test
Console.WriteLine(" String:" + test1.obj);
Console.Read();
T>
{
public T obj;
public Test(T obj)
public Test(T obj)
{
this.obj = obj;
int:2
String:hello world
程式分析:
1、 Test是一個泛型類。 T是要實例化的範式類型。如果T被實例化為int型,那麼成員變數obj就是int型的,如果T被實例化為string型,那麼obj就是string類型的。
2、 根據不同的類型,上面的程式顯示出不同的數值。
C#泛型機制:
C#泛型能力有CLR在運行時支援:C#泛型程式碼在編譯為IL程式碼和元資料時,採用特殊的佔位符來表示範式類型,並用專型有的IL指令支援泛型操作。而真正的泛型實例化工作以「on-demand」的方式,發生在JIT編譯時。
看看剛才的程式碼中Main函數的元資料
.method private hidebysig static void Main(string[] args) cil managed
point
79 (0x4f)
.maxstack 2
.locals init ([0] int32 obj,
[2] string obj2,
[3] class CSharpStudy1.Test` 1
IL_0000: nop
IL_0001: ldc.i4.2
IL_0004: newobj instance void class CSharpStudy1.Test`1
IL_0009: stloc.1
IL_000a: ldstr ldfld !0 class CSharpStudy1.Test`1
IL_0015: box [mscorlib]System.Int32
IL_001a: call string [mscorlib]System.String::Concat(object,
object)
IL_001f: call void [mscorlib]System.Console::WriteLine(string )
IL_0024: nop
IL_0025: ldstr "hello world"
IL_002a: stloc.2
IL_002b: ldloc.2
IL_002c: newobj stloc.3
IL_0032: ldstr 「字符串:"
IL_0037: ldloc.3
IL_0038: ldfld !0 字串[mscorlib]System.String::Concat(string,
字串)
IL_0042: 呼叫void [mscorlib]System.Console::WriteLine(string)
IL_0047: noppah ystem.Console::Read()
IL_004d: 流行
IL_004e: ret
} // 方法結束Program::Main
接下來看看測試類別中建構函數的元資料
.method .ctor(!T obj) cil Managed
{
// 代碼大小 17 (0x11)
.maxstack 8
🎠 id [mscorlib]System.Object::.ctor()
IL_0006: 不
IL_0007 : nop
IL_0008: ldarg.0
IL_0009: ¢ SharpTest1.Test`1::obj
IL_000f: nop
IL_0010: ret
} / / end of method Test`1::.ctor
1、第一輪編譯時,編譯器只為Test
2、JIT編譯時,當JIT編譯器第一次遇到Test
3、CLR為所有類型參數為“引用類型”的泛型類型產生相同的一個代碼;但是如果類型參數為“值類型”,對每一個不同的“值類型”,CLR將表示產生一個獨立的程式碼。因為實例化一個引用類型的泛型,它在記憶體中分配的大小是一樣的,但是當實例化一個值類型的時候,在記憶體中分配的大小是不一樣的。
C#泛型特點:
1、如果實例化泛型類型的參數相同,那麼JIT 編輯器就可以重複使用該類型,因此,C# 的泛化類型能夠避免了C++ 靜態模板可能導致程式碼膨脹的問題。
2、C# 泛化類型具有豐富的引用元數據,因此C#的泛型類型可以實現強大的引用技術。
3、C#的泛型類型採用“基類、接口、構造器,值類型/引用類型”的約束方式來實現對類型參數的引用“顯示約束”,提高了類型安全的同時,也失去了基於「簽章」的隱式約束所具有的高靈活性的C++模板
C#泛型繼承:
C#除了聲明可以另外泛型類型(包括類別與結構)外,也可以在基底類別中包含泛型類型的聲明。但基底類別如果是泛型類型,它的型別或以實例化,或是來自子類別(同樣是泛型型別)宣告的型別參數,看如下型別
class C
class D :C
class E:C
class F:C
類G:C // 非法
E型別為C型別提供了U、V,所以上面說的來自子類
F型別繼承於C
G類型為非法的,因為G類型不是泛型,C是泛型,G無法提供C泛型的實例化
泛型類型的成員:
泛型類型的成員可以使用泛型類型宣告中的型別參數。但類型參數如果沒有任何約束,則只能在該類型上使用從System.Object繼承的公有成員。如下圖:
泛型介面:
泛型介面的型別參數不是實例化,或是來自實作類別宣告的型別參數
泛型委託:
泛型委託在回傳值和參數上都應用參數類型,這些參數類型同樣可以附帶合法的限制
delegate bool MyDelegate
class MyClass
{
.}
static bool G(string s){...}
static void Main()
MyDelegate
}
}
泛型方法:
1、C#泛型機制只支援「在方法宣告上包含型別參數」-即泛型方法。
2、C#泛型機制不支援在方法以外的其他成員(包括屬性、事件、索引器、建構器、析構器)的宣告上包含型別參數,但這些成員本身可以包含在泛型類型中,並使用泛型類型的型別參數。
3、泛型方法既可以包含在泛型類型中,也可以包含在非泛型類型中。
泛型方法宣告:如下
public static int FunctionName
泛型方法的重載:
型法的重載:
型法的重載: );
public void Function1(U a);
這樣是不能構成泛型方法的重載。因為編譯器無法確定泛型類型T和U是否不同,也就無法確定這兩種方法是否不同
public void Function1
public void Function1(int x);
這樣可以構成重載
public void Function1
public void Function1
這樣不能構成泛型方法這樣不能構成泛型方法這樣不能構成泛型方法的重載。因為編譯器無法確定約束條件中的A和B是否不同,也就無法確定這兩個方法是否不同
泛型方法重寫:
在重寫的過程中,抽象類別中的抽象方法的約束是預設繼承的。如下:
abstract class Base
{
public abstract T F
);
}
class MyClass:Base
{
public override X F
. IComparable{}
}
對於MyClass中兩個重寫的方法來說
F方法是合法的,約束被默認繼承
G方法是非法的,指定任何約束都是多餘的
G方法是非法的,指定任何約束都是多餘的
泛型限制:
1、C#泛型要求對“所有泛型類型或泛型方法的類型參數”的任何假定,都要基於“顯式的約束”,以維護C#所要求的類型安全。
2、“顯式約束”由where子句表達,可以指定“基類約束”,“接口約束”,“構造器約束”,“值類型/引用類型約束”共四種約束。
3、“明確約束”並非必須,如果沒有指定“明確約束”,範式類型參數將只能存取System.Object類型中的公有方法。例如:在開始的例子中,定義的那個obj成員變數。例如我們在開始的例子中加入一個Test1類,在它當中定義兩個公共方法Func1、Func2,如下圖:
下面就開始分析這些限制:
基類約束:
下面就開始分析這些約束:
基類約束:
下面就開始分析這些限制class A
{
public void Func1()
{
public void Func2()
, T>
where S : A
where T : B
{
//S的變因可以呼叫Func1方法
s.Func1();
t.Func2();
}
}
介面限制:
interface IA
{
T Func1();
}🎠 void Func2();
}
inter T Func3();
}
class MyClass
, IC
{
public MyClass(T t, V v)
{
//T中的物件中使用Func1 //T的物件 //V的物件可稱為Func2與Func3
v );
}
}
構造器約束:
class A🎠 public A()
{ }
}
public B(int i )
{ }
}
{
T t;
t = new T();
}
}
public void Func()
{
C d = new C ();
}
}
less. in the generic type or method C
注意:C#現在只支援無參的構造器約束
此時由於我們為B類型寫入了一個有參構造器,使得系統不會再為B自動創建一個無參的構造器,但是如果我們將B型別中加一個無參構造器,那麼物件d的實例化就不會報錯了。 B類型定義如下:
class B
{
public B()
{ }
}
值型/引用型別:
public struct A 🜠值類型/引用型態:
public struct A
public class C
C c2 = new C();
c2物件在編譯時錯誤:The type 'B' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or methor 'C
總結:
1、C#的泛型能力由CLR在運行時支持,它既不同於C++在編譯時所支援的靜態模板,也不同於java在編譯器層面使用「擦拭法」支援的簡單的泛型。
2、C#的泛型支援包括類別、結構、介面、委託四種泛型類型,以及方法成員。
3、C#的泛型採用“基類,接口,構造器,值類型/引用類型”的約束方式來實現對類型參數的“顯式約束”,它不支援C++模板那樣的基於簽名的隱式約束。
以上就是C#泛型程式設計的內容,更多相關內容請關注PHP中文網(www.php.cn)!

C#和.NET提供了強大的功能和高效的開發環境。 1)C#是一種現代、面向對象的編程語言,結合了C 的強大和Java的簡潔性。 2).NET框架是一個用於構建和運行應用程序的平台,支持多種編程語言。 3)C#中的類和對像是面向對象編程的核心,類定義數據和行為,對像是類的實例。 4).NET的垃圾回收機制自動管理內存,簡化開發者的工作。 5)C#和.NET提供了強大的文件操作功能,支持同步和異步編程。 6)常見錯誤可以通過調試器、日誌記錄和異常處理來解決。 7)性能優化和最佳實踐包括使用StringBuild

.NETFramework是一個跨語言、跨平台的開發平台,提供一致的編程模型和強大的運行時環境。 1)它由CLR和FCL組成,CLR管理內存和線程,FCL提供預構建功能。 2)使用示例包括讀取文件和LINQ查詢。 3)常見錯誤涉及未處理異常和內存洩漏,需使用調試工具解決。 4)性能優化可通過異步編程和緩存實現,保持代碼可讀性和可維護性是關鍵。

C#.NET保持持久吸引力的原因包括其出色的性能、豐富的生態系統、強大的社區支持和跨平台開發能力。 1)性能表現優異,適用於企業級應用和遊戲開發;2).NET框架提供了廣泛的類庫和工具,支持多種開發領域;3)擁有活躍的開發者社區和豐富的學習資源;4).NETCore實現了跨平台開發,擴展了應用場景。

C#.NET中的設計模式包括Singleton模式和依賴注入。 1.Singleton模式確保類只有一個實例,適用於需要全局訪問點的場景,但需注意線程安全和濫用問題。 2.依賴注入通過注入依賴提高代碼靈活性和可測試性,常用於構造函數注入,但需避免過度使用導致複雜度增加。

C#.NET在現代世界中廣泛應用於遊戲開發、金融服務、物聯網和雲計算等領域。 1)在遊戲開發中,通過Unity引擎使用C#進行編程。 2)金融服務領域,C#.NET用於開發高性能的交易系統和數據分析工具。 3)物聯網和雲計算方面,C#.NET通過Azure服務提供支持,開發設備控制邏輯和數據處理。

C#.NET開發者社區提供了豐富的資源和支持,包括:1.微軟的官方文檔,2.社區論壇如StackOverflow和Reddit,3.GitHub上的開源項目,這些資源幫助開發者從基礎學習到高級應用,提升編程技能。

C#.NET的優勢包括:1)語言特性,如異步編程簡化了開發;2)性能與可靠性,通過JIT編譯和垃圾回收機制提升效率;3)跨平台支持,.NETCore擴展了應用場景;4)實際應用廣泛,從Web到桌面和遊戲開發都有出色表現。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

禪工作室 13.0.1
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具