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 에 쓰 여 있 으 면 천 층 탑 처럼 아파 보인다.이제 다이나믹 이 등장 할 차례 다.
.Net 4.0 이후 동적 데이터 형식 인 dynamic 키 워드 를 지원 합 니 다.흥분 되 는 것 은 dynamic 이 어떤 유형의 값 으로 대 입 될 수 있다 는 것 이다.물론 범 형 도 포함한다.
그러나 주의해 야 할 것 은 dynamic 키 워드 는 프로그램 이 컴 파일 될 때 검사 하지 않 고 실행 할 때 만 동적 으로 판정 되 기 때문에 사용 할 때 특히 조심해 야 한 다 는 점 이다.
물론 여러 번 운행 할 때의 성능 은 포장 과 뜯 는 것 보다 훨씬 높 고 쓰기 도 상당히 간결 하고 아름 답 습 니 다(*175*175).

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>();
  }
추가 작업 을 직접 수행 할 수 있 지만 실제 들 어 오 는 두 데이터 형식 이 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\#범 형 데이터 유형 판정 과 전환 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기