2017-05-11 1 views
3

나는 주니어 동료에게 권투를 설명하려고합니다.어떤 상황에서 복싱은 현대 C#에서 발생합니까?

표준 예제는 ArrayList 인 것 같습니다. 예를 들어

  • Why do we need boxing and unboxing in C#?
    • Understanding Boxing and Unboxing in C#
    • 그러나 이것은 ( this answer에서 설명) 제네릭 도입 C# 2에서 List<T>로 대체되었다.

      그래서 제네릭 시대에 어떤 상황에서 복싱 가치를 찾을 수 있습니까?


      편집 : 권투를 사용하는 것이 여전히 가능 여부, 내가 물어 아니에요 분명합니다. 나는 제네릭이 ArrayList을 쓸모 없게 만들었던 지금 왜 우리가 복싱을 사용할 것인지를 묻고있다.


      편집 2 :을 나는이 이미 분명 생각하지만 나는 또한 ArrayListList<T>의 차이에 대해 묻는 게 아니에요. 사실,이 질문은 제네릭이 우리가 ArrayList을 사용할 필요가 없다는 것을 의미한다는 사실에 전적으로 전제되어 있습니다. 따라서 이러한 상황에서 박스 값을 사용할 필요가 없습니다.

    +2

    이렇게하면 :'object x = (object) 24;', 당신은 박스에 넣었습니다. –

    +1

    변경된 사항 없음 - 조건이 동일합니다. –

    +0

    제 편집을 참조하십시오. - 상자 작성 방법이나 아직 가능한지 묻지 않습니다. 나는 왜 누군가가 요즘 박스가 될지 묻는다. –

    답변

    3

    권투 및 언 박싱은 사용자가 명시 적으로 수행하는 것이 아닙니다. struct을 손에 들고 언제든지 object을 기대하는 수신기로 전달할 때마다 항상 발생하는 것입니다. 그래서,이 코드를 고려하십시오

    public void SafeToString(Object a) 
    { 
        if(a != null) 
         return a.ToString(); 
        return "null"; 
    } 
    
    SafeToString(42); 
    

    당신이 (42)가 ToString() 방법을 가지고 컴파일러에 의해 알려져 있으며, struct는 서브 클래스화할 수 없기 때문에 42.ToString(), 아니 복싱이 없을 것이라고 말했다 않았다면, 등등 운영 ToString() 방법 42는 컴파일 시간에 알려집니다. 그러나

    , 당신은 SafeToString(42); 42이 int.ToString()에 권투 객체의 ToString(), 어떤 대표로 확인 Object.ToString()를 호출 SafeToString()에 전달되는 객체,,,로 박스 포장됩니다 말한다.

    +0

    안녕 Mike. 이 답변을 주셔서 감사합니다. 희망을 가지기를 바랍니다.하지만 방금 게시 한 블로그에서 인용했습니다. http://blog.tdwright.co.uk/2017/05/12/what-is-boxing-and-why- 너 - 너 - care/ –

    +0

    @ 톰 라이트 내가 기분이 고맙다, 고마워! C - : = –

    2

    제네릭은 좋은 일이지만, 복싱을 다루는 필요성을 완전히 없앨 수는 없습니다.

    ArrayList은 쓸모 없지만 가끔 List<object>을 사용하여 하나의 목록에 다른 유형을 저장할 때만 사용합니다 (Object은 공통점이 있습니다).

    또 다른 예는 일반적인 방법입니다. 컴파일 타임에 유형을 알고 있다면 다시 좋지만, 어떤 유형으로도 작업 할 수 있다면 어떨까요? 좋은 오래된 object 매개 변수와 복싱 (캐스팅과 함께) 구조.

    +0

    이 답변을 주셔서 감사합니다. 걱정하지 마시길 바랍니다. 그러나 방금 게시 한 블로그 게시물에서이를 참조했습니다. http://blog.tdwright.co.uk/2017/05/12/what-is-boxing-and-why- 당신 - 케어 / –

    관련 문제