apple developer:C# 泛型中的数据类型判断与转换

admin 3个月前 (07-18) 科技 42 0

提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型:

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

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

浮点家族:float,double,decimal

伶仃的枚举:enum

伶仃的布尔:bool

2.常用的引用类型有:

string,class,array,delegate,interface

值得注意的是,无论是值类型照样引用类型,在C#中都派生于object,没错,这家伙就是万恶之源!

正是由于有了这一特征,于是我们才气通过装箱和拆箱愉快地将这些数据类型在值类型,object,引用类型间频频横跳。

固然了,无论是装箱和拆箱,对于性能都是有消耗的,不到万不得已的时刻只管不要用(虽然我才不管这些,只要我用的爽就行了233)

 

虽然一样平常不提倡用object类型作为函数参数,取而代之使用泛型成为首选,那么若何判断泛型参数的详细数据类型并举行有用转换呢?

好比下面的例子:

 1 [System.Serializable]
 2 public struct Property<T> where T : struct
 3 {
 4     public string Label { get; }
 5     public T Value { get; }
 6     public PropertyType Type { get; }
 7     public Property(string label, T value, PropertyType type = PropertyType.Sub)
 8     {
 9         Label = label;
10         Value = value;
11         Type = type;
12     }
13 
14     public static Property<T> operator +(Property<T> a, Property<T> b)
15     {
16         var prop = new Property<T>();
17         if (a.Label == b.Label && a.Type == b.Type)
18         {
19             //怎么知道这个值到底是int照样float...
20         }
21         return prop;
22     }
23 }
1 public enum PropertyType
2 {
3     Main,
4     Sub
5 }

界说了一个名叫「属性」的结构体,包罗标签,详细值和属性种别(是主属性照样副属性),并使用泛型约束数据为值类型。

现在想要快速对这个结构体举行加法操作,于是增添操作符重载函数,利便愉快的对两个属性的值相加,但问题是泛型是无法强转为任何一种非object数据类型,直接相加则更是不可能。

 

这时就想到了以object类型作为桥梁,举行详细的类型判断与转换:

 1     public static Property<T> operator +(Property<T> a, Property<T> b)
 2     {
 3         if (a.Label == b.Label && a.Type == b.Type)
 4         {
 5             object tempa = a.Value;
 6             object tempb = b.Value;
 7 
 8             object add;
 9             if (tempa is int)
10             {
11                 add = (int)tempa + (int)tempb;
12             }
13             else if (tempa is float)
14             {
15                 add = (float)tempa + (float)tempb;
16             }
17             //...其他类型
18             else
19             {
20                 return new Property<T>();
21             }
22 
23             return new Property<T>(a.Label, (T)add, a.Type);
24         }
25         return new Property<T>();
26     }

判断类型时可以使用is关键字,也可直接取得值的类型或泛型类型举行判断:

1             if (tempa.GetType() == typeof(float))
2             {
3 
4             }
5             //or
6             if (typeof(T) == typeof(float))
7             {
8 
9             }

 

上面的方案虽然可以解决类型转换的需求,但频仍的拆箱和装箱以及类型判断对性能的照样有一定影响,而且若是每一种类型都写进if-else,看上去像千层塔一样平常难受。是时刻轮到dynamic登场了。

.Net 4.0 以后最先支持动态数据类型——也就是dynamic关键字;令人兴奋的是,dynamic可以被赋值为任何一种类型的值,固然也包罗泛型。

然而值得注意的是,dynamic关键字并不会在程序编译的时刻举行校验,而只在运行时动态判断,以是使用的时需要格外小心。

固然了,多次运行时的性能要远远高于装箱和拆箱,而且誊写起来也是相当简练雅观(¯﹃¯):

 1     public static Property<T> operator +(Property<T> a, Property<T> b)
 2     {
 3         if (a.Label == b.Label && a.Type == b.Type)
 4         {
 5             dynamic x1 = a.Value;
 6             dynamic x2 = b.Value;
 7             return new Property<T>(a.Label, (T)(x1 + x2), a.Type);
 8         }
 9         return new Property<T>();
10     }

可以直接执行相加操作,但若是现实传入的两个数据类型并不能相加如bool,则会在运行时报错;固然了,若是想进一步防止平安,还可以增添更多的类型判断语句,如:

 1     public static Property<T> operator +(Property<T> a, Property<T> b)
 2     {
 3         if (a.Label == b.Label && a.Type == b.Type)
 4         {
 5             if (typeof(T) != typeof(bool) && typeof(T)!=typeof(Enum))
 6             {
 7                 dynamic x1 = a.Value;
 8                 dynamic x2 = b.Value;
 9                 return new Property<T>(a.Label, (T)(x1 + x2), a.Type);
10             }
11         }
12         return new Property<T>();
13     }

 

弥补一句,dynamic关键字在Unity中可能会报错,由于Unity默认用的是.Net Api为2.0版本,需要升级为4.0之后的版本才气使用该关键字,详细设置如下:

 

 

下面做一个简朴测试:

 1 using UnityEngine;
 2 
 3 public class MicrosoftCSharpTest : MonoBehaviour
 4 {
 5     void Start()
 6     {
 7         dynamic a = 5.1f;
 8         dynamic b = 3;
 9         Debug.Log(a + b);
10 
11         var hp1 = new Property<int>("Hp", 41);
12         var hp2 = new Property<int>("Hp", 5);
13         var hp = hp1 + hp2;
14         Debug.Log(hp.Label + " : " + hp.Value);
15 
16         var miss1 = new Property<float>("MissRate", .1f);
17         var miss2 = new Property<float>("MissRate", .05f);
18         var miss = miss1 + miss2;
19         Debug.Log(miss.Label + " : " + miss.Value);
20     }
21 }

 

,

欧博官网手机

欢迎进入欧博官网手机(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Allbet欧博官网声明:该文看法仅代表作者自己,与本平台无关。转载请注明:apple developer:C# 泛型中的数据类型判断与转换

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:716
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1286
  • 评论总数:350
  • 浏览总数:21364