Sunullo
286
2021-05-07 11:33:35
8
526

C# 제네릭에서도 형변환이 되던데, 박싱언박싱처럼 속도가 느려질까요??


public void Init<T>(List<T> info)

{

  for(int i = 0; i < info.Count; i++

  {

  var data = info[i] as GameMyInfo;

  string name = data.myname();

  } 

}

제네릭으로 받아온 클래스의 멤버 변수 사용할려고

이런식으로 as 사용해서 T를 GameMyInfo라는 클래스로 변환하면 되던데..


이 경우 박싱언박싱처럼 속도 저하가 있을까요?

애초에 받아온 클래스와 동일해도?

0
  • 답변 8

  • Sunullo
    286
    2021-05-07 12:30:40
  • 태현짱와우
    883
    2021-05-07 12:32:47

    진짜 엄청난 양의 데이터 아니면 박싱 언박싱으론 속도 저하 거의 안나요

    제네릭 where조건 걸어주면 안할거같긴 하네요

  • 안전라이딩
    1k
    2021-05-07 12:57:49

    Sunullo 음.. 제가 보기엔 같은 선상에서 생각가능한 질문이라고 봐서요. 뭐 아니었나보군요.



  • cathei
    413
    2021-05-07 13:28:33
  • 캐티
    5k
    2021-05-07 13:38:41

    어쩌다 찾은거 보니 as 나 캐스팅은 머 어떻고 is 를 쓰라고 하시는 분들이 많쩌여.
    https://stackoverflow.com/questions/496096/casting-vs-using-the-as-keyword-in-the-clr

    이것도 보는쩌여. Object 나 머 다른타입으로 안하고 바로 클래스를 매개변수에 지정해서 하면 대는듯 하빈다.
    https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/generics/

    글머 캐스팅이나 강제변환이나 임시변환 같은데서 분기문이 들어가거나 예외발생의 부작용이 적겠쩌여.

  • Sunullo
    286
    2021-05-07 14:36:07

    cathei 오오..그럼 제네릭으로 받아온 것을 형변환 해도 언박싱 박싱처럼 속도가 느려질 일은 없겠군요?

  • CyanGlint
    1k
    2021-05-07 17:29:49

    제네릭의 올바른 사용법은 T가 어떤 자료형인지 컴파일러에게 알려주는겁니다.


    대표적인 사용례


    var list = new List<GameMyInfo>();

    //for-loop

    var name = list[i].myname();


    처럼 list[i]를 GameMyInfo로 캐스팅 할 필요 없이 접근 가능해야 합니다.


    T를 입력받는 입장에서 T를 특정 클래스라고 가정하려면

    태현짱와우님 답변처럼 where절을 붙이면 됩니다.


    class ???<T> where T: GameMyInfo


    이렇게 하면 T가 GameMyInfo 또는 GameMyInfo를 상속하는 클래스로 제한되며

    들어오는 T가 뭔지 컴파일러가 알고 있으니 llist[i]를 GameMyInfo로 캐스팅할 필요가 없습니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.