2010-06-23 30 views
11

Tôi có một giao diện IEntityĐang truyền sang giao diện chuyển đổi quyền anh?

public interface IEntity{ 
    bool Validate(); 
} 

Và tôi có một nhân viên lớp mà thực hiện giao diện này

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

Bây giờ nếu tôi có đoạn mã sau

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

Nếu nó không phải là một boxing chuyển đổi sau đó như thế nào diễn viên làm việc?

+0

Trong trường hợp này, không cần phải truyền. Nhân viên thực hiện giao diện IEntity, vì vậy bạn có thể tự do gán một tham chiếu đến IEntity (ent1 trong ví dụ của bạn) cho bất kỳ tham chiếu nào của Employee (một lần nữa vì nó triển khai giao diện IEntity) mà không yêu cầu một diễn viên rõ ràng. – Alan

Trả lời

16

Không, kể từ Employee là một lớp, là reference type thay vì value type.

Từ MSDN:

Boxing là quá trình chuyển đổi một kiểu giá trị đến đối tượng loại hoặc bất kỳ loại giao diện thực hiện theo kiểu giá trị này. Khi CLR đặt giá trị loại , giá trị này sẽ kết thúc tốt hơn giá trị bên trong một hệ thống . Lưu trữ và lưu trữ nó trên vùng được quản lý. Unboxing chiết xuất loại giá trị từ đối tượng.

Liên kết MSDN nói trên có các ví dụ khác để giúp làm rõ chủ đề.

+0

Có thể làm rõ thực tế rằng mặc dù nó không có trong ví dụ thực tế mà OP cho thấy, nó * có thể * trong một tình huống khác. –

0

Không, không phải.

Ví dụ về nhân viên của bạn đã là Loại tham chiếu. Các kiểu tham chiếu được lưu trữ trên Heap do đó nó không cần phải được đóng hộp/không được đóng hộp.

Boxing chỉ xảy ra khi bạn lưu trữ một loại giá trị trên Heap hay, trong ngôn ngữ MSDN, bạn có thể nói:

Boxing là một chuyển đổi ngầm của một loại giá trị gia tăng (C# tham khảo) để loại đối tượng hoặc bất kỳ loại giao diện nào được thực hiện bởi loại giá trị này. Boxing loại giá trị phân bổ đối tượng thể hiện trên heap và sao chép giá trị vào đối tượng mới.

0

Không, đấm bốc xảy ra khi bạn chuyển đổi loại giá trị thành đối tượng.

+0

Tôi nghĩ bạn có nghĩa là có dấu phẩy ',' sau từ đầu tiên trong câu trả lời ngắn gọn của bạn. Nếu không có điều này - đó là, như câu trả lời của bạn hiện đang đứng - nó có ý nghĩa ngược lại, và do đó là không chính xác. –

0

Quyền anh có nghĩa là chuyển đổi loại giá trị thành đối tượng. Bạn đang chuyển đổi loại tham chiếu sang loại tham chiếu khác, vì vậy đây không phải là chuyển đổi quyền anh.

8

Trong ví dụ trên, không, nhưng đôi khi có.

Đấm bốc là quá trình "đấm bốc" một loại giá trị thành đối tượng có thể tham chiếu; một loại tham chiếu. Trong ví dụ của bạn ở trên, Employee đã là một kiểu tham chiếu, vì vậy nó không được đóng hộp khi bạn đưa nó vào IEntity.

Tuy nhiên, đã có Nhân viên là loại giá trị, chẳng hạn như cấu trúc (thay vì một lớp), sau đó có.

2

No.

Do emp1 là loại tham chiếu.

Đấm bốc xảy ra khi loại giá trị được chuyển đổi thành đối tượng hoặc loại giao diện.

4

Như những người khác đã nói, hãy truyền loại tham chiếu đến giao diện KHÔNG phải là ví dụ về quyền anh, nhưng truyền một loại giá trị cho giao diện 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. 
Các vấn đề liên quan