2012-03-05 28 views
44

Câu hỏi này là vì lợi ích. Tôi đang làm việc với một thư viện của bên thứ ba và đã xem qua các tài liệu sau đây về một lớp CMS.Security.Dummy:C# 4 có tối ưu hóa các không gian tên theo cách mà các phiên bản C# trước đó không?

KHÔNG DELETE CLASS NÀY - Lớp này ngăn cản việc biên dịch từ thả toàn bộ không gian tên dưới .NET 4.0.

Có ai biết hay không ai có thể suy đoán tại sao .NET 4 sẽ bỏ không gian tên nếu lớp giả đã bị xóa?

Vì .NET 4 được đặt tên rõ ràng trong nhận xét mã nguồn, tôi giả định các phiên bản C# trước đây thể hiện hành vi không yêu cầu lớp giả này. Đó hoàn toàn là suy đoán.

Screen bắn

documentation

decompiled Source Code

#region Assembly CMS.SettingsProvider.dll, v4.0.30319 
// ...\solution\wwwroot\Bin\CMS.SettingsProvider.dll 
#endregion 

using System; 

namespace CMS.Security 
{ 
    // Summary: 
    //  DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping 
    //  entire namespace under .NET 4.0. 
    public class Dummy 
    { 
     // Summary: 
     //  DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping 
     //  entire namespace under .NET 4.0. 
     public Dummy(); 
    } 
} 
+0

Sẽ rất thú vị nếu bạn thấy có điều gì giống như vậy trong phiên bản trước 4.0 của thư viện. – AakashM

+6

Các không gian tên IIRC không tồn tại trong CIL dưới dạng các thực thể riêng biệt - chúng chỉ đơn giản trở thành một phần của tên loại đủ điều kiện. (AFAIK đó là đúng cho tất cả các phiên bản của CLI và không cụ thể cho .NET 4.) Theo nghĩa này tôi sẽ hỗ trợ câu trả lời của @Jon Skeet. – stakx

+0

Một câu hỏi hay được nêu ra bởi một yêu cầu đáng ngờ :) –

Trả lời

90

Thực tế ít được đánh giá cao là không có điều như "không gian tên" từ quan điểm của hệ thống kiểu CLR cơ bản. Thay vào đó, nó chỉ là một quy ước mà chúng tôi nói rằng một loại có chứa dấu chấm trong tên của nó là "một thành viên của không gian tên". Logic không có sự khác biệt nào giữa bộ luật:

namespace N 
{ 
    class C {} 
} 

và psuedo-code:

class N.C {} 

C# buộc bạn phải giả vờ viễn tưởng thú vị này là thực tế, nhưng nó chỉ là một là viễn tưởng - từ quan điểm của hệ thống loại CLR, tất nhiên. Từ quan điểm của trình biên dịch C#, tất nhiên các không gian tên là "thực". Chúng không tương ứng với bất kỳ thứ gì trong siêu dữ liệu ngoài một phần tên của một loại.

Tóm lại: nếu bạn tạo một hội đồng có không gian tên "trống" thì "không gian tên" không tồn tại ở tất cả trong nhị phân đã biên dịch. Một "không gian tên" chỉ xuất hiện khi có một loại trong thư viện có các dấu chấm trong tên của nó.

Bây giờ, tại sao bạn quan tâm đến việc đảm bảo rằng không gian tên "trống" có sự hiện diện nào đó ở dạng nhị phân, tôi không biết.

tôi giả hành vi phiên bản C# triển lãm trước đó mà không cần lớp này giả

Nope. Mỗi phiên bản của C# kể từ 1.0 sẽ loại bỏ các vùng tên trống.

+2

Câu trả lời hay giải thích tuyệt vời! –

+1

Tôi sẽ giả định lý do họ quan tâm đến việc có một không gian tên trống là vì họ tham khảo nó bằng cách sử dụng các câu lệnh ở nơi khác. Nếu không gian tên không tồn tại, câu lệnh sử dụng đó sẽ là lỗi biên dịch. Tại sao không chỉ đơn giản là xóa các báo cáo sử dụng? Nó có thể là đầu ra của một số công cụ tạo mã mà họ không có quyền kiểm soát. (Ít nhất, đây là tình huống mà tôi đã gặp phải trước đây.) – Tadmas

23

Cho rằng không gian tên không chứa bất kỳ thành viên (không có lớp đó), tôi không chắc chắn thậm chí có cả khái niệm của không gian tên tại thời điểm đó ... cũng như tôi không mong đợi nó sẽ là usefu Dù sao đi nữa.

Tôi vừa cố gắng sao chép điều này bằng trình biên dịch C# 2 và tôi không thể thấy bất kỳ dấu vết nào của vùng tên trống trong IL.

7

Vấn đề liên quan đến bán duy nhất mà tôi có thể nghĩ đến là khi biên soạn một dự án trong msbuild, các tham chiếu gián tiếp không phải lúc nào cũng được sao chép vào thư mục bin của ứng dụng hiện tại. Nếu thư viện B gián tiếp tham khảo thư viện A và thư viện C chỉ tham chiếu B, đầu ra của thư viện A sẽ không nhất thiết được sao chép vào thư mục bin khi biên dịch thư viện C. Trong quá khứ, tôi đã sử dụng tham chiếu trường rỗng trên lớp để đảm bảo rằng phụ thuộc là rõ ràng và đầu ra được triển khai đúng cách. Có lẽ các nhà phát triển ban đầu đã trải qua điều gì đó tương tự và đây là giải pháp của họ?

+0

Bạn có thể đúng về lý do cho nó, trong đó không gian tên dự kiến ​​sẽ được nhìn thấy cho một mục đích: có thể bởi một công cụ hoặc một số cạnh tối nghĩa trường hợp trong một thử nghiệm. Ai biết. Tôi muốn các tài liệu hướng dẫn nêu tại sao không gian tên phải tồn tại chỉ vì lợi ích của nó. –

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