문제

내가 찾는 것에 대한 명확하고,간결하고 정확한 답을 얻을 수 있습니다.

이상적으로는 실제 대답이지의 링크 좋은 설명을 환영합니다.

도움이 되었습니까?

해결책

박스 값이 데이터 구조 는 최소한의 래퍼 기본 형식*.박스 값은 일반적으로 저장되는 포인터로 개 .

따라서,박스 값을 사용하여 더 많은 메모리에 최소한 두 가지 메모리 액세스 조회:을 얻기 위해 한 번의 포인터,다른 것을 따라 포인터를 기울입니다.물론 이런 종류의 당신이 원하는 귀하의 내부 루프가 있습니다.다른 한편으로,박스 값이 일반적으로 더 나은 다른 형태에서 시스템입니다.이후 그들은 첫 번째 클래스에서 데이터 구조,언어,그들이 예상되는 메타데이터 구조와는 다른 데이터 구조다.

Java 켈 일반적인 컬렉션을 포함할 수 없습니다 unboxing 값입니다.일반적인 컬렉션을.NET 보유할 수 있 unboxing 값 없이 처벌을 받을 수 있습니다.Java 의 제네릭만 사용한 컴파일 시간 형식 검사,.NET 를 생성하는 특정 클래스를 위해 각각의 일반적인 유형 인스턴스에서 실행 시간.

자바일 수 있 unboxing 배열을,하지만 그들은 분명히 더 적은 편리한 다른 것보다 컬렉션이 있습니다.그러나,최고의 성능이 필요한 가치가있는 작은 불편의 오버헤드를 방지하려면 복싱과 unboxing.

*이에 대한 토론,기본 값은 어떤 것에 저장할 수 있습니다 호출 스택, 오히려 이상으로 저장되는 포인터 값에 힙.자주하는 기계류(정수,수레,etc.),구조체,그리고 때로는 정적이즈 배열입니다..NET-땅들을 가치 유형(반대하는 유형을 참조).Java 사람들은 그들에게 전화로 기본 형식.Haskellions 그냥 그들에게 전화 박스 없음.

**난에 초점을 맞추 Java,Haskell,C#에서 이 대답은 무엇 때문에,내가 알고있다.For what it's worth,Python,Ruby,자바 스크립트는 모든이 독점적으로 박스 값이 있습니다.이것은 또한"으로 알려진 모든 개체"접근 방식***.

***주의:충분히 고급컴파일러/JIT 수 있는 어떤 경우에는 실제로 감지하는 값은 의미가 박스를 찾을 때,소스에서 안전하게 도달할 수 있는 unboxing 값을 수 있습니다.본질적으로 감사를 화려한 언어로 구현 자신의자는 때때로 무료입니다.

다른 팁

C#3.0 간단히 말해서:

복싱은 행동의 주는 가치 유형으로 유형을 참조:

int x = 9; 
object o = x; // boxing the int

개봉에...반:

// unboxing o
object o = 9; 
int x = (int)o; 

Boxing&unboxing 변환하는 프로세스는 기본값으로는 객체지향적인 랩퍼 클래스(복싱),거나 변환하는 값에서는 객체지향적인 랩퍼 클래스를 다시 기본 값(unboxing).

예를 들어,java,필요할 수 있으로 변환 int 값으로는 Integer (복싱)하려는 경우에 저장 Collection 기 때문에 기본 형식을 저장할 수 없습에 Collection, 단체입니다.하지만 당신이 원하는 때 그것을 다시 얻을 수 밖의 Collection 을 얻을 수도 있습 값으로 int 과하지 않는 Integer 그래서 당신은 언 박스습니다.

복싱과 제품 개봉하지 않은 본질적으로 , 지만,그것은 단점이 존재합니다.언어에 따라 구현,그것은 속도가 느려질 수 있습과 더 많은 메모리를 많이 사용하는 것보다 단지 기본 요소.그러나,그것도 사용할 수 있도록 높은 수준의 데이터 구조와 더욱 유연에서 당신의 코드입니다.

이러한 일,그것은 가장 일반적으로 논의의 컨텍스트에서 자바의(그리고 다른 언어의)"autoboxing/autounboxing"기능이 있습니다.기 java 중심적 설명의 autoboxing.

습니다.순:

자주에 의존할 수는 없습의 어떤 유형을 변수 기능을 것이다 소비하는,그래서 당신은 당신을 사용할 필요가 개체 변수는 확장에서 가장 낮은 공통 분모니다.순이 object.

그러나 object 클래스고 저장하는 내용을 참조할 수 있습니다.

List<int> notBoxed = new List<int> { 1, 2, 3 };
int i = notBoxed[1]; // this is the actual value

List<object> boxed = new List<object> { 1, 2, 3 };
int j = (int) boxed[1]; // this is an object that can be 'unboxed' to an int

는 동안 둘 모두 이러한 동일한 정보는 두 번째 목록은 더 크고 느립니다.각각의 값의 두 번째 목록에서 실제로 참조 object 을 보유하고 int.

이기 때문에 박스 int 감싸고 object.을 때 그것의 캐스팅을 다시 int 은 unboxing-으로 다시 변환하여 그것의 값입니다.

에 대한 가치 유형(예:모든 structs)이 느리고 잠재적으로 많이 사용하고 더 많은 공간을 제공합니다.

참고를 위한 형식(i.e모든 classes 다)이 훨씬 적은 문제의 저장되어 있기 때문에,사용자 참조로 어쨌든.

더 문제가 박스 값이 유형이 있다는 것입니다 분명히 나타나지 않는 당신이 당신과 함께 다루고 있어 박스,이 아닌 값으로 설정합니다.비교할 경우 두 가지 structs 다음 당신은 값을 비교하지만,비교할 때 두 가지 classes 다음을(기본적으로)당신이 비교 참조-즉는 이러한 동일한가?

이 혼동 될 수 있습을 처리할 때는 박스 가치 유형:

int a = 7;
int b = 7;

if(a == b) // Evaluates to true, because a and b have the same value

object c = (object) 7;
object d = (object) 7;

if(c == d) // Evaluates to false, because c and d are different instances

그것은 쉽게 작동:

if(c.Equals(d)) // Evaluates to true because it calls the underlying int's equals

if(((int) c) == ((int) d)) // Evaluates to true once the values are cast

그러나 그것이 다른 것을 조심해야의 다룰 때는 박스 값이 있습니다.

니다.NET FCL 일반적인 컬렉션:

List<T>
Dictionary<TKey, UValue>
SortedDictionary<TKey, UValue>
Stack<T>
Queue<T>
LinkedList<T>

모든 설계를 극복하는 성능 문제의 복싱과 unboxing 에서 이전 컬렉션 구현.

더 많은 참조하십시오 chapter16, CLR 를 통해 C#(2nd Edition).

복싱은 프로세스의 변환하는 값을 입력한 참조 형식입니다.

Unboxing 이의 전환을 참조 입력 값으로 입력.

EX: int i=123;
    object o=i;// Boxing
    int j=(int)o;// UnBoxing

가치 형식은:
int,char 및 구조,열거.참고 형식은:클래스,인터페이스,배열,문자열 및체

복싱과 제품 개봉을 용이하게 가치 유형으로 처리하여야 개체입니다.복싱 의미한 값을 변환하는 개체의 인스턴스를 참조하 유형입니다.예를 들어, Int 클래스고 int 은 데이터를 입력합니다.변환 int 하기 Int 은 돕기의 권투 반면,변환 Int 하기 int 은 unboxing.개념이 도움이에서 가비지 컬렉션,Unboxing,다른 한편으로는,변환 개체형 가치를 유형입니다.

int i=123;
object o=(object)i; //Boxing

o=123;
i=(int)o; //Unboxing.

다른것 같이,autoboxing 문제가 될 수 있는 경우에 사용하지 않는다.고전이 끝까지 함께 nullpointerexception 이하지 않을 추적할 수 있다.심지어는 디버거.이것을 보십시오:

public class TestAutoboxNPE
{
    public static void main(String[] args)
    {
        Integer i = null;

        // .. do some other stuff and forget to initialise i

        i = addOne(i);           // Whoa! NPE!
    }

    public static int addOne(int i)
    {
        return i + 1;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top