最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Where 泛型約束的實(shí)現(xiàn)

 更新時間:2025年04月22日 11:50:47   作者:程序猿多布  
本文主要介紹了C# Where 泛型約束的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在C#中,Where關(guān)鍵字主要有兩種用途

1、在泛型約束中限制類型參數(shù)

2、在LINQ查詢中篩選數(shù)據(jù)

本文主要介紹where關(guān)鍵字在在泛型約束中的使用

泛型定義中的 where 子句指定對用作泛型類型、方法、委托或本地函數(shù)中類型參數(shù)的參數(shù)類型的約束。通過使用 where 關(guān)鍵字和泛型約束,可以創(chuàng)建更安全、更靈活的泛型類和方法的實(shí)現(xiàn)。

使用的對象

Where可以對、方法、委托接口使用。

類的使用,例如C#中常用的List<T>

方法的使用,

public void MyFunc<T>() where T:struct

委托的使用

public delegate void MyDelete<T>() where T : class;

接口的使用

約束分類

約束

說明

where T : struct

T必須是值類型,如int,double等

where T : class

T必須是引用類型,如string,List<T>等

where T : new()

T必須有無參構(gòu)造函數(shù),即T參數(shù)可以通過使用new關(guān)鍵字創(chuàng)建實(shí)例。當(dāng)與其他約束一起使用時,new() 約束必須最后指定。

where T : 基類

T 必須繼承自某個基類

where T : 接口

T 必須實(shí)現(xiàn)某個接口

where T : U

T 必須派生自 U

where T : struct

public class MyClass<T> where T : struct
{
    public T Value { get; set; }
}

例子:

// 只接受值類型的泛型方法
public class ValueCalculator<T> where T : struct
{
    public T Add(T a, T b)
    {
        return (dynamic)a + (dynamic)b; // 簡單示例,實(shí)際中需要更安全的實(shí)現(xiàn)
    }
}

// 使用示例
class Program
{
    static void Main()
    {
        var intCalc = new ValueCalculator<int>();
        Console.WriteLine(intCalc.Add(5, 3)); // 輸出 8
        
        // 下面這行會編譯錯誤,因?yàn)?string 是引用類型
        // var stringCalc = new ValueCalculator<string>();
    }
}

where T : class

public class MyClass<T> where T : class
{
    public T Value { get; set; }
}

例子 

public class Repository<T> where T : class, new()
{
    private List<T> items = new List<T>();
    
    public T CreateItem()
    {
        var newItem = new T(); // 可以實(shí)例化,因?yàn)橛?new() 約束
        items.Add(newItem);
        return newItem;
    }
    
    public void DisplayCount()
    {
        Console.WriteLine($"Items count: {items.Count}");
    }
}

// 使用示例
class Program
{
    class Customer
    {
        public string Name { get; set; }
    }
    
    static void Main()
    {
        var repo = new Repository<Customer>();
        var customer = repo.CreateItem();
        customer.Name = "John Doe";
        repo.DisplayCount(); // 輸出 Items count: 1
    }
}

where T : new()

public class Factory<T> where T : new()
{
    public T CreateInstance()
    {
        return new T();
    }
}

where T : 基類

public class AnimalShelter<T> where T : Animal
{
    public void Shelter(T animal)
    {
        animal.Feed();
    }
}

where T : 接口

public class Sorter<T> where T : IComparable<T>
{
    public void Sort(T[] array)
    {
        Array.Sort(array);
    }
}

 例子

using System;

// 定義一個接口
public interface IDisplayable
{
    void Display();
}

// 實(shí)現(xiàn)接口的類
public class Product : IDisplayable
{
    public string Name { get; set; }
    
    public void Display()
    {
        Console.WriteLine($"Product: {Name}");
    }
}

// 使用 where 約束確保 T 實(shí)現(xiàn) IDisplayable
public class DisplayManager<T> where T : IDisplayable
{
    public void Show(T item)
    {
        item.Display(); // 安全調(diào)用,因?yàn)橹?T 有 Display 方法
    }
}

// 使用示例
class Program
{
    static void Main()
    {
        var product = new Product { Name = "Laptop" };
        var manager = new DisplayManager<Product>();
        manager.Show(product);
    }
}

where T : U

public class DerivedContainer<T, U> where T : U
{
    // T 必須繼承自 U 或?qū)崿F(xiàn) U(如果 U 是接口)
}

 例子

public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Some animal sound");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark!");
    }
}

// 約束 T 必須繼承自 Animal
public class AnimalShelter<T> where T : Animal
{
    public void LetAnimalMakeSound(T animal)
    {
        animal.MakeSound(); // 可以調(diào)用 Animal 的方法
    }
}

// 使用示例
class Program
{
    static void Main()
    {
        var shelter = new AnimalShelter<Dog>();
        shelter.LetAnimalMakeSound(new Dog()); // 輸出 "Bark!"
    }
}

多重約束

可以為類型參數(shù)指定多個約束

需要注意的是:當(dāng)與其他約束一起使用時,new() 約束必須最后指定。

public class MyClass<T> where T : class, IDisposable, new()
{
    
}

多個類型參數(shù)的約束

對于多個類型參數(shù),每個都可以有自己的約束:

 public class MyClass<TKey, TValue>
 where TKey : IComparable<TKey>
 where TValue : class,new()
 {
     
 }

約束的優(yōu)點(diǎn)

1、增強(qiáng)類型安全 - 編譯器可以在編譯時捕獲類型不匹配的錯誤。

2、減少運(yùn)行時轉(zhuǎn)換 - 避免不必要的類型檢查和轉(zhuǎn)換。

3、啟用更多操作 - 知道類型參數(shù)具有某些特性(如特定方法或構(gòu)造函數(shù))后,可以在泛型代碼中 使用這些特性。

4、不會對性能產(chǎn)生可測量的影響。

總結(jié):合理使用泛型約束可以顯著提高代碼質(zhì)量和安全性,但應(yīng)該避免過度使用導(dǎo)致不必要的復(fù)雜性。在大多數(shù)情況下,優(yōu)點(diǎn)遠(yuǎn)大于缺點(diǎn),特別是在開發(fā)庫代碼或框架時。

到此這篇關(guān)于C# Where 泛型約束的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# Where 泛型約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • winform調(diào)用javascript的小例子

    winform調(diào)用javascript的小例子

    winform調(diào)用javascript的小例子,需要的朋友可以參考一下
    2013-05-05
  • C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法

    C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法

    這篇文章主要介紹了C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法,涉及C#針對數(shù)據(jù)庫的創(chuàng)建、連接、導(dǎo)入等相關(guān)操作技巧,需要的朋友可以參考下
    2015-12-12
  • 使用C#調(diào)用百度地圖并實(shí)現(xiàn)坐標(biāo)點(diǎn)的設(shè)置以及讀取示例

    使用C#調(diào)用百度地圖并實(shí)現(xiàn)坐標(biāo)點(diǎn)的設(shè)置以及讀取示例

    這篇文章主要介紹了使用C#調(diào)用百度地圖并實(shí)現(xiàn)坐標(biāo)點(diǎn)的設(shè)置以及讀取示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#使用Task實(shí)現(xiàn)異步方法

    C#使用Task實(shí)現(xiàn)異步方法

    本文主要介紹了C#使用Task實(shí)現(xiàn)異步方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C#基礎(chǔ)之異步調(diào)用實(shí)例教程

    C#基礎(chǔ)之異步調(diào)用實(shí)例教程

    這篇文章主要介紹了C#中的異步調(diào)用,對比同步調(diào)用分析了異步調(diào)用的原理及特點(diǎn),并以實(shí)例形式給出了實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-09-09
  • 詳解c# 事件總線

    詳解c# 事件總線

    這篇文章主要介紹了c# 事件總線的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-05-05
  • 大家應(yīng)該掌握的多線程編程

    大家應(yīng)該掌握的多線程編程

    這篇文章主要介紹了大家應(yīng)該掌握的多線程編程,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • C#  Task  TaskFactory  設(shè)置最大并行線程數(shù)的方法

    C#  Task  TaskFactory  設(shè)置最大并行線

    本文深入探討了LimitedConcurrencyLevelTaskScheduler的工作原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • C#訪問命令行的兩種方法

    C#訪問命令行的兩種方法

    這篇文章主要介紹了C#訪問命令行的兩種方法,實(shí)例分析了C#操作命令行的兩種常用技巧,需要的朋友可以參考下
    2015-06-06
  • c# Newtonsoft 六個值得使用的特性(下)

    c# Newtonsoft 六個值得使用的特性(下)

    這篇文章主要介紹了c# Newtonsoft 六個值得使用的特性,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評論

墨江| 山丹县| 右玉县| 元谋县| 顺义区| 牟定县| 精河县| 青州市| 永兴县| 土默特左旗| 渭源县| 南漳县| 溆浦县| 宜昌市| 乐昌市| 郧西县| 县级市| 拜泉县| 清苑县| 望江县| 舞阳县| 界首市| 稷山县| 萨迦县| 兴业县| 安龙县| 民丰县| 福海县| 西林县| 鞍山市| 三门峡市| 蚌埠市| 呼图壁县| 沁阳市| 全南县| 黎城县| 南丹县| 昌平区| 柳河县| 浪卡子县| 乌拉特中旗|