2011-10-22 27 views
5

Hãy xem xét chúng tôi có ứng dụng 3 cấp và có ba dự án có tên P1, P2, P3.Các phụ thuộc tham chiếu C# khác với VB?

phụ thuộc: P1 (dữ liệu) < < P2 (Business Logic) < < P3 (Presentation)

P2 đã có một lớp cơ sở X đã được thừa hưởng trong một lớp khác Y trong P2 . Vì vậy, chúng tôi thêm P1 từ P1 vào P2. Tuy nhiên, P3 sử dụng P2. Y và không sử dụng P1. X trực tiếp.

Để thực hiện việc này, chúng tôi phải thêm ref P2 vào P3. Nhưng có sự khác biệt giữa VB và C#.

Trong VB, chúng tôi chỉ thêm ref P2 vào P3. P2 sử dụng P1 nhưng nó không quan trọng đối với P3. Chúng tôi không cần phải thêm từ P1 đến P3. Điều này là đủ!

Nhưng, trong C#, chúng ta phải thêm ref P1 và P2 cả P3 ngay cả khi P3 không sử dụng P1.X. Nếu bạn không thêm ref A đến C, bạn sẽ gặp lỗi bên dưới:

Loại 'P1.X' được định nghĩa trong một hội đồng không được tham chiếu. Bạn phải thêm tham chiếu vào assembly 'P1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'.

Tại sao chúng ta phải thêm hai dự án trong C#?

Hoặc, thay vì điều này, chúng tôi có thể chặn hành vi này không?

Trả lời

1

Lý do có thể là P2 công khai cho thấy các thành viên có loại được xác định trong P1. Trong trường hợp đó P1 cũng phải được tham chiếu trong P3, ngay cả khi bạn không sử dụng nó một cách rõ ràng trong P3.

Ví dụ:

// Assembly P1 
public class C1 
{ 
    ... 
} 

// Assembly P2 
public class C2 
{ 
    public string Foo { get; set; } 
    public C1 Bar { get; set; } 
} 

// Assembly P3 
void Main() 
{ 
    C2 c = ... 
    Console.WriteLine(c.Foo); 
} 

Trong đoạn mã trên, P3 sử dụng C2 (quy định tại P2), và C2 cho thấy một thành viên của loại C1 (quy định tại P1), do đó P3 phải tham khảo P1 (ngay cả khi nó không sử dụng C2.Bar) .


EDIT: thực sự tôi đã sai: bạn phải tham khảo P1 chỉ nếu bạn tham khảo C2.Bar ... Hành vi này là giống hệt nhau trong VB như trong C#, tôi chỉ cố gắng (nếu bạn không thêm tham khảo P1 bạn nhận được this error). Nếu trước đây bạn không có sự ràng buộc này trong các dự án VB, nó chỉ vì P3 không sử dụng bất cứ thứ gì phụ thuộc vào P1.

+0

Điều này giải thích sự khác biệt VB.NET/C#? –

+0

@Kirk, không có nó ... –

+1

Vâng, như bạn đã nói rằng chúng ta phải thêm P1 ref vào P3 trong C#. Nhưng chúng tôi không phải thêm nó vào VB. Đây là câu hỏi tôi hỏi ... –

Các vấn đề liên quan