Compartilhar via


Boxing implícita de tipos de valor

Boxing de tipos de valor foi alterado de Managed Extensions for C++ para Visual C++.

Design de linguagem, podemos impostas uma posição filosóficas no lugar de uma experiência prática com o recurso e, na prática, era um engano.Como uma analogia no original vários design de linguagem de herança, Stroustrup decidiu que sub-object uma classe base virtual não pôde ser inicializado no construtor de classe derivada e, portanto, o idioma necessário que qualquer classe que serve como uma classe base virtual deve definir um construtor padrão.É esse construtor padrão que seria chamado por qualquer derivação virtual subseqüente.

O problema de uma hierarquia de classe base virtual é que desloca a responsabilidade para a inicialização do sub-object de virtual compartilhado com cada derivação subseqüente.Por exemplo, se definir o uma classe base para a inicialização requer a alocação de um buffer, o tamanho do buffer especificado pelo usuário pode ser passado como um argumento para o construtor.Se eu então fornecer duas derivações virtuais subseqüentes, chamam inputb e outputb, cada um fornece um valor específico para o construtor de classe base.Agora, quando eu derivado um in_out classe ambos inputb e outputb, nenhum desses valores para sub-object classe base virtual compartilhada podem ser facilmente permitidos para avaliar.

Portanto, no design do idioma original, Stroustrup proibido inicialização explícita de uma classe base virtual dentro da lista de inicialização de membro do construtor de classe derivada.Enquanto isso resolveu o problema, na prática, a incapacidade para direcionar a inicialização da classe base virtual provou impracticable.Keith Gorlen da National Institute de integridade, que tinha implementado uma versão freeware da biblioteca de coleção SmallTalk chamada nihcl, foi uma voz princípio convencendo Stroustrup ele tinha acompanham um design mais flexível do idioma.

Um princípio de design hierárquico orientado a objeto mantém que uma classe derivada deve se preocupar apenas com a implementação não particulares de suas classes base imediatas.Para um projeto de inicialização flexíveis de suporte para herança virtual, Stroustrup precisou violar esse princípio.A classe mais derivada de uma hierarquia assume responsabilidade por todos os inicialização sub-object virtual independentemente de como profundidade na hierarquia que ele ocorre.Por exemplo, inputb e outputb são responsáveis por explicitamente Inicializando sua classe base virtual imediata.Quando in_out deriva de ambos inputb e outputb, in_out torna-se responsável para a inicialização de uma vez removidos classe base virtual e a inicialização explicitado dentro inputb e outputb é suprimida.

Isso fornece a flexibilidade necessária por desenvolvedores de idioma, mas ao custo de uma semântica complicada.Essa sobrecarga de complicação é ajustada fora se podemos restringir uma classe base virtual sem estado e simplesmente permite especificar uma interface.Este é um idioma de design recomendado em C++.Dentro da programação de CLR, ele é disparado a diretiva com o tipo de Interface.

Aqui está uma sample– de código simples e nesse caso, é desnecessário boxing explícita:

// Managed Extensions for C++ requires explicit __box operation
int my1DIntArray __gc[] = { 1, 2, 3, 4, 5 };
Object* myObjArray __gc[] = { 
   __box(26), __box(27), __box(28), __box(29), __box(30)
};

Console::WriteLine( "{0}\t{1}\t{2}", __box(0),
   __box(my1DIntArray->GetLowerBound(0)),
   __box(my1DIntArray->GetUpperBound(0)) );

Como você pode ver, há muito boxing acontecendo.Em Visual C++, tipo de valor conversão boxing é implícito:

// new syntax makes boxing implicit
array<int>^ my1DIntArray = {1,2,3,4,5};
array<Object^>^ myObjArray = {26,27,28,29,30};

Console::WriteLine( "{0}\t{1}\t{2}", 0, 
   my1DIntArray->GetLowerBound( 0 ), 
   my1DIntArray->GetUpperBound( 0 ) );

Consulte também

Referência

Conversão boxing (Extensões de Componentes C++)

Conceitos

Tipos de valor e seus comportamentos (C++/CLI)