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

詳解C# 泛型中的數據類型判定與轉換

 更新時間:2020年07月18日 08:50:31   作者:汐夜  
這篇文章主要介紹了C# 泛型中的數據類型判定與轉換,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

提到類型轉換,首先要明確C#中的數據類型,主要分為值類型和引用類型:

1.常用的值類型有:(struct)

整型家族:int,byte,char,short,long等等一系列

浮點家族:float,double,decimal

孤獨的枚舉:enum

孤獨的布爾:bool

2.常用的引用類型有:

string,class,array,delegate,interface

值得注意的是,無論是值類型還是引用類型,在C#中都派生于object,沒錯,這家伙就是萬惡之源!

正是因為有了這一特性,于是我們才能通過裝箱和拆箱愉快地將這些數據類型在值類型,object,引用類型間反復橫跳。

當然了,無論是裝箱和拆箱,對于性能都是有消耗的,不到萬不得已的時候盡量不要用(雖然我才不管這些,只要我用的爽就行了233)

雖然一般不提倡用object類型作為函數參數,取而代之使用泛型成為首選,那么如何判斷泛型參數的具體數據類型并進行有效轉換呢?

比如下面的例子:

[System.Serializable]
public struct Property<T> where T : struct
{
  public string Label { get; }
  public T Value { get; }
  public PropertyType Type { get; }
  public Property(string label, T value, PropertyType type = PropertyType.Sub)
  {
    Label = label;
    Value = value;
    Type = type;
  }

  public static Property<T> operator +(Property<T> a, Property<T> b)
  {
    var prop = new Property<T>();
    if (a.Label == b.Label && a.Type == b.Type)
    {
      //怎么知道這個值到底是int還是float...
    }
    return prop;
  }
}
 public enum PropertyType
 {
   Main,
   Sub
 }

定義了一個名叫「屬性」的結構體,包含標簽,具體值和屬性類別(是主屬性還是副屬性),并使用泛型約束數據為值類型。

現在想要快速對這個結構體進行加法操作,于是增加操作符重載函數,方便愉快的對兩個屬性的值相加,但問題是泛型是無法強轉為任何一種非object數據類型,直接相加則更是不可能。

這時就想到了以object類型作為橋梁,進行具體的類型判定與轉換:

public static Property<T> operator +(Property<T> a, Property<T> b)
  {
    if (a.Label == b.Label && a.Type == b.Type)
    {
      object tempa = a.Value;
      object tempb = b.Value;

      object add;
      if (tempa is int)
      {
        add = (int)tempa + (int)tempb;
      }
      else if (tempa is float)
      {
        add = (float)tempa + (float)tempb;
      }
      //...其他類型
      else
      {
        return new Property<T>();
      }

      return new Property<T>(a.Label, (T)add, a.Type);
    }
    return new Property<T>();
  }

判定類型時可以使用is關鍵字,也可直接取得值的類型或泛型類型進行判定:

if (tempa.GetType() == typeof(float))
      {

      }
      //or
      if (typeof(T) == typeof(float))
      {

      }

上面的方案雖然可以解決類型轉換的需求,但頻繁的拆箱和裝箱以及類型判定對性能的還是有一定影響,而且如果每一種類型都寫進if-else,看上去像千層塔一般難受。是時候輪到dynamic登場了。

.Net 4.0 以后開始支持動態(tài)數據類型——也就是dynamic關鍵字;令人興奮的是,dynamic可以被賦值為任何一種類型的值,當然也包括泛型。

然而值得注意的是,dynamic關鍵字并不會在程序編譯的時候進行校驗,而只在運行時動態(tài)判定,所以使用的時需要格外小心。

當然了,多次運行時的性能要遠遠高于裝箱和拆箱,而且書寫起來也是相當簡潔美觀(¯﹃¯):

public static Property<T> operator +(Property<T> a, Property<T> b)
  {
    if (a.Label == b.Label && a.Type == b.Type)
    {
      dynamic x1 = a.Value;
      dynamic x2 = b.Value;
      return new Property<T>(a.Label, (T)(x1 + x2), a.Type);
    }
    return new Property<T>();
  }

可以直接執(zhí)行相加操作,但如果實際傳入的兩個數據類型并不能相加如bool,則會在運行時報錯;當然了,如果想進一步防止安全,還可以增加更多的類型判定語句,如:

public static Property<T> operator +(Property<T> a, Property<T> b)
  {
    if (a.Label == b.Label && a.Type == b.Type)
    {
      if (typeof(T) != typeof(bool) && typeof(T)!=typeof(Enum))
      {
        dynamic x1 = a.Value;
        dynamic x2 = b.Value;
        return new Property<T>(a.Label, (T)(x1 + x2), a.Type);
      }
    }
    return new Property<T>();
  }

補充一句,dynamic關鍵字在Unity中可能會報錯,因為Unity默認用的是.Net Api為2.0版本,需要升級為4.0之后的版本才能使用該關鍵字,具體設置如下:

下面做一個簡單測試:

using UnityEngine;

public class MicrosoftCSharpTest : MonoBehaviour
{
  void Start()
  {
    dynamic a = 5.1f;
    dynamic b = 3;
    Debug.Log(a + b);

    var hp1 = new Property<int>("Hp", 41);
    var hp2 = new Property<int>("Hp", 5);
    var hp = hp1 + hp2;
    Debug.Log(hp.Label + " : " + hp.Value);

    var miss1 = new Property<float>("MissRate", .1f);
    var miss2 = new Property<float>("MissRate", .05f);
    var miss = miss1 + miss2;
    Debug.Log(miss.Label + " : " + miss.Value);
  }
}

以上就是詳解C# 泛型中的數據類型判定與轉換的詳細內容,更多關于C# 泛型 數據類型判定與轉換的資料請關注腳本之家其它相關文章!

相關文章

  • C#多線程學習之(二)操縱一個線程的方法

    C#多線程學習之(二)操縱一個線程的方法

    這篇文章主要介紹了C#多線程學習之操縱一個線程的方法,實例分析了C#中線程的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#實現圖形位置組合轉換的方法

    C#實現圖形位置組合轉換的方法

    這篇文章主要介紹了C#實現圖形位置組合轉換的方法,涉及C#使用Matrix操作圖形的相關技巧,需要的朋友可以參考下
    2015-06-06
  • 淺談C#中的string駐留池

    淺談C#中的string駐留池

    這篇文章主要介紹了C#中的string駐留池的的相關資料,文中示例代碼非常細致,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • C#編寫DES加密、解密類

    C#編寫DES加密、解密類

    本文給大家匯總了一下使用C#實現的DES加密、解密類的代碼,十分的簡單實用,有需要的小伙伴可以參考下
    2015-05-05
  • C# 進行圖片壓縮的示例代碼(對jpg壓縮效果最好)

    C# 進行圖片壓縮的示例代碼(對jpg壓縮效果最好)

    這篇文章主要介紹了C# 進行圖片壓縮的示例代碼,幫助大家更好的利用c# 處理圖片,提高辦公效率,感興趣的朋友可以了解下
    2020-11-11
  • C#實現在應用程序間發(fā)送消息的方法示例

    C#實現在應用程序間發(fā)送消息的方法示例

    這篇文章主要介紹了C#實現在應用程序間發(fā)送消息的方法,結合具體實例形式分析了C#實現項目之間信息發(fā)送、接收等交互操作相關技巧,需要的朋友可以參考下
    2017-06-06
  • C#獲取DataTable對象狀態(tài)DataRowState

    C#獲取DataTable對象狀態(tài)DataRowState

    這篇文章介紹了C#獲取DataTable對象狀態(tài)DataRowState的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C#獲取U盤序列號的方法

    C#獲取U盤序列號的方法

    這篇文章主要介紹了C#獲取U盤序列號的方法,涉及C#針對硬件底層信息操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 共享鎖using范圍的實現方法

    共享鎖using范圍的實現方法

    共享鎖using范圍的實現方法,需要的朋友可以參考一下
    2013-04-04
  • 通過C#和RTSPClient實現簡易音視頻解碼功能

    通過C#和RTSPClient實現簡易音視頻解碼功能

    在多媒體應用中,實時傳輸協議(RTSP)用于流媒體服務,特別是音視頻?監(jiān)控系統,通過?C#?和?RTSPClient?庫,可以輕松實現簡易的音視頻解碼和播放功能,本文將詳細介紹如何使用?C#?和?RTSPClient?構建一個簡易但高效的音視頻解碼器,需要的朋友可以參考下
    2024-12-12

最新評論

双牌县| 铜山县| 洞头县| 绥滨县| 弋阳县| 福建省| 阿拉善右旗| 乌兰县| 四子王旗| 汝南县| 长乐市| 龙口市| 大连市| 北辰区| 息烽县| 桐乡市| 白朗县| 肇源县| 新兴县| 秭归县| 班玛县| 余干县| 香格里拉县| 永定县| 镇康县| 阿拉善右旗| 景宁| 龙里县| 双城市| 琼海市| 荃湾区| 阜新| 元阳县| 宣化县| 聊城市| 太仓市| 驻马店市| 南木林县| 崇文区| 太仓市| 宿松县|