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\#범 형 데이터 유형 판정 과 전환 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.