电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

ASP.NET泛型二之泛型的使用方法

瀏覽:235日期:2022-06-08 14:30:38

".NET泛型"系列:

在" ASP.NET泛型一之泛型簡介與基本語法"中,了解了泛型的基本概念,本篇偏重于泛型的使用。主要包括:

泛型方法重載需要注意的問題

public class MyArray<T>
{
    public T myData;

    public MyArray()
    {
myData = default(T);
    }

    public void ShowInfo()
    {
Console.WriteLine(myData.ToString());
    }

    public void ShowInfo(string str)
    {
Console.WriteLine(str);
    }

    public void ShowInfo<T>(T data)
    {
Console.WriteLine(data.ToString());
    }
}

以上,說明:泛型方法可以作為方法的重載。

可以這樣調用。

MyArray<Student> myArray = new MyArray<Student>();
myArray.ShowInfo<CollegeStudent>(new CollegeStudent());
myArray.ShowInfo<string>("HelloWorld");

但還有一種情況是:兩個語義不明的重載方法,在編譯的時候是通過的,但在調用的時候就不會通過。比如以下在編譯時沒問題:

public class MyArray<T>
{
    public void ShowInfo<TA, TB>(TA a, TB b){};
    public void ShowInfo<TB, TA>(TA a, TB b){};
}

如果這樣調用,就有問題:

MyArray<Student> myArray = new MyArray<Student>();
myArray.showInfo<Student, Student>(new Student(), new Student());

所以,對于泛型重載方法,需要注意語義不明的情況。

泛型的類型推斷

編譯器可以根據方法參數的類型來推斷使用哪個重載方法,優先調用一般重載方法,然后再調用泛型重載方法。

myArray.ShowInfo("hello"); //會調用 ShowInfo(string str)重載方法
myArray.ShowInfo(new CollegeStudent());//會調用ShowInfo<T>(T data)重載方法。

泛型方法也可以有約束

我們知道泛型類可以有約束,泛型方法也一樣。

public void ShowInfo<T>(T data)  where TData : Student
{
    Console.WriteLine(data.ToString());
}

泛型接口

.NET集合類就提供了多個泛型接口,比如:IList<T>, ICollection<T>, IComparable<>, IComparer<T>, IEnumerable<T>, IEnumerator<T>, IDictionary<TKey,TValue>,等等。

自定義類的時候,有時候需要讓自定義類實現一個指定了具體類型的泛型接口:

class MyClass<T> : IComparable<Int32>, IComparable<String>

泛型委托

public class Generic Delegate
{
    //聲明泛型委托
    public delegate string MyGenericDelegate<T>(T t);

    public static string GetPoint(Point p)
    {
return stirng.Format("地址是{0},{1}", p.X, p.Y);
    }

    public static string GetMsg(string str)
    {
return str;
    }
}

public static void Main()
{
    MyGenericDelegate<string> myStrDel = new MyGenericDelegate<string>(GetMsg);
    Console.WriteLine(myStrDel("hello"));

    MyGenericDelegate<Point> myPointDel = new MyGenericDelegate<Point>(GetPoint);
    Console.WriteLine(myPointDel(new Point(100, 200)));
}

使用EventHandler<TEventArgs>事件泛型

它的完整定義是:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs: EventArgs

假設有一個MessageReceiver類,當建立連接時觸發OnConnected事件,在接收到信息是觸發OnMessageReceived事件。

在創建MessageReceiver類之前,我們先要自定義一個派生于EventArgs,且和MessageReceiver相關的類。

public sealed class MessageReceivedEventArgs : EventArgs
{
    public string Message {get;set;}

    public MessageReceivedEventArgs(string msg)
    {
this.Message = msg;
    }
}

MessageReceiver類主要包含2個事件,一個是OnConnected事件,另一個是OnMessageReceived事件。

public class MessageReceiver
{
    public event EventHandler OnConnected;
    public event EventHandler<MessageReceivedEventArgs> OnMessageReceived;
    ...

    public void DoSth()
    {
if(OnMessageReceived != null)
{
    OnMessageReceived(this, new MessageReceivedEventArgs(msg));
}
    }
}

以上,通過if(OnMessageReceived != null)這個判斷,能保證:當沒有訂閱者注冊事件的時候,這個事件不被觸發。但在多線程場景中,這樣做也不是最合理的:

假設線程A作為訂閱者注冊事件,正準備觸發事件的時候,線程B也作為訂閱者剛好在此刻注銷了事件,即OnMessageReceived變成了null,這就牽累到線程A也無法觸發事件。

解決辦法是把事件變量賦值給一個局部變量:

public class MessageReceiver
{
    public event EventHandler OnConnected;
    public event EventHandler<MessageReceivedEventArgs> OnMessageReceived;
    ...

    public void DoSth()
    {
var handler = OnMessageReceived;
if(handler != null)
{
    handler(this, new MessageReceivedEventArgs(msg));
}
    }
}

這樣,當線程A作為訂閱者注冊并準備觸發事件的時候,及時線程B在此刻注銷注冊,讓OnMessageReceived為null,由于已經把OnMessageReceived賦值給了局部變量handler,線程A依然能觸發事件。

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽: ASP.NET
相關文章:
主站蜘蛛池模板: 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 | 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 土壤墒情监测站_土壤墒情监测仪_土壤墒情监测系统_管式土壤墒情站-山东风途物联网 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 深圳市源和塑胶电子有限公司-首页 | 中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折! | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司| 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 搜活动房网—活动房_集装箱活动房_集成房屋_活动房屋 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 杭州ROHS检测仪-XRF测试仪价格-百科 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 中式装修设计_全屋定制家具_实木仿古门窗花格厂家-喜迎门 | 【同风运车官网】一站式汽车托运服务平台,验车满意再付款 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 氟塑料磁力泵-不锈钢离心泵-耐腐蚀化工泵厂家「皖金泵阀」 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 打包钢带,铁皮打包带,烤蓝打包带-高密市金和金属制品厂 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 | 包头市鑫枫装饰有限公司| 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 上海道勤塑化有限公司| 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 |