2010-06-23 12 views
11

Mam interfejs IEntityCzy rzutowanie na interfejs jest konwersją bokserską?

public interface IEntity{ 
    bool Validate(); 
} 

I mam klasy Pracownik, który implementuje ten interfejs

public class Employee : IEntity{ 
    public bool Validate(){ return true; } 
} 

Teraz jeśli mam następujący kod

Employee emp1 = new Employee(); 
IEntity ent1 = (IEntity)emp1; // Is this a boxing conversion? 

Jeśli nie jest to boks konwersji, a następnie w jaki sposób działa obsada?

+0

W tym przypadku rzutowanie nie jest wymagane. Pracownik implementuje interfejs IEntity, dzięki czemu można swobodnie przypisać odniesienie do IEntity (ent1 w twoim przykładzie) do dowolnego odniesienia Pracownika (ponownie, ponieważ implementuje on interfejs IEntity), nie wymagając wyraźnej obsady. – Alan

Odpowiedz

16

Nie, ponieważ Employee to klasa, która jest reference type, a nie value type.

Z MSDN:

Boks jest proces konwersji typu wartość do obiektu typu lub dowolnego typu interfejsu realizowanego przez ten typ wartości. Gdy pole CLR przyjmuje wartość typu , zawija wartość wewnątrz obiektu System.Object i zapisuje ją na sterowanej stercie . Unboxing wyodrębnia z komputera typ wartości .

Wyżej wymienione łącze MSDN zawiera dalsze przykłady, które powinny pomóc w wyjaśnieniu tematu.

+0

Prawdopodobnie warto wyjaśnić fakt, że chociaż nie jest to w rzeczywistym przykładzie, jak pokazuje OP, to * może być * w innej sytuacji. –

0

Nie, nie jest.

Twoja instancja pracownika jest już typem odniesienia. Typy referencyjne są przechowywane na stertach, więc nie trzeba ich zapakować/rozpakować.

Boks występuje tylko wtedy, gdy można przechowywać typ wartości na stercie, lub w języku MSDN, można powiedzieć:

Boks jest niejawna konwersja typów wartości (C# odniesienia) do typu obiekt lub dowolny typ interfejsu zaimplementowany według tego typu wartości. Boxing typ wartości przydziela obiekt wystąpienie na stercie i kopiuje wartość do nowego obiektu.

0

Nie, boks pojawia się, gdy konwertujesz typ wartości na obiekt.

+0

Myślę, że masz na myśli przecinek "po pierwszym słowie w krótkiej odpowiedzi. Bez tego - to znaczy, jak obecnie odpowiada twoja odpowiedź - ma ona przeciwne znaczenie, a zatem jest niepoprawna. –

0

Boks oznacza konwersję typu wartości na obiekt. Konwertujesz typ referencyjny na inny typ odniesienia, więc nie jest to konwersja bokserska.

8

W powyższym przykładzie nie, ale czasami tak.

Boks to proces "boksowania" typu wartości na obiekt referencyjny; typ referencyjny. W powyższym przykładzie Pracownik jest już typem referencyjnym, więc nie jest zapakowany, gdy rzucisz go do IEntity.

Jednak, czy pracownik był typem wartości, takim jak struct (zamiast klasy), to tak.

2

nr

Ponieważ emp1 jest typu odniesienia.

Boks pojawia się, gdy typ wartości jest konwertowany na obiekt lub typ interfejsu.

4

Jak powiedzieli inni, rzutowanie typu referencyjnego na interfejs NIE jest przykładem boksu, ale rzutowanie typu wartości na interfejs IS.

public interface IEntity { 
    bool Validate(); 
} 

public class EmployeeClass : IEntity { 
    public bool Validate() { return true; } 
} 

public struct EmployeeStruct : IEntity { 
    public bool Validate() { return true; } 
} 


//Boxing: A NEW reference is created on the heap to hold the struct's memory. 
//The struct's instance fields are copied into the heap. 
IEntity emp2 = new EmployeeStruct(); //boxing 

//Not considered boxing: EmployeeClass is already a reference type, and so is always created on the heap. 
//No additional memory copying occurs. 
IEntity emp1 = new EmployeeClass(); //NOT boxing 

//unboxing: Instance fields are copied from the heap into the struct. 
var empStruct = (EmployeeStruct)emp2; 
//empStruct now contains a full shallow copy of the instance on the heap. 


//no unboxing. Instance fields are NOT copied. 
var empClass = (EmployeeClass)emp2; //NOT unboxing. 
//empClass now points to the instance on the heap. 
Powiązane problemy