2012-04-17 42 views
34

Tôi có một thư viện lớp học và tôi chỉ sử dụng một phần của nó. Có cần phải xóa những gì không được sử dụng để thu nhỏ kích thước của mã được tạo ra (trong cấu hình phát hành) không?Trình biên dịch sẽ chỉ biên dịch mã có thể được thực thi?

Theo như tôi đã thấy, trình biên dịch sẽ xử lý điều đó và xóa mã không thay đổi kích thước tệp EXE. Điều này sẽ luôn luôn đúng? Loại bỏ tất cả các mã không cần thiết sẽ mất rất nhiều thời gian, vì vậy tôi muốn biết nếu có cần thiết cho điều đó.

Thông tin khác: có các phương thức và lớp trong thư viện lớp không được gọi từ mã thực thi, nhưng được tham chiếu bởi các phần mã khác trong thư viện lớp (mà bản thân chúng không bao giờ được gọi).

+3

Bạn luôn có thể lấy bộ phản xạ .NET và chỉ xem những gì được đưa vào DLL "đã phát hành". Cách tốt nhất để học là thử nghiệm (hoặc như vậy là kinh nghiệm của tôi) –

+3

Trình biên dịch có thể nói rằng bạn sẽ không bao giờ phân phối DLL đó cho ai đó có thể cố gắng sử dụng mã đó không? –

+1

@AnthonyPegram Thư viện không được biên dịch riêng biệt. Tôi có mã nguồn trong dự án của mình. – ispiro

Trả lời

34

Không, trình biên dịch cũng bao gồm mã "đã chết". Một lý do đơn giản cho việc này là không phải lúc nào cũng có thể biết chính xác mã nào sẽ và sẽ không được thực thi. Ví dụ, ngay cả một phương thức riêng tư không bao giờ được tham chiếu có thể được gọi thông qua sự phản chiếu, và các phương thức công khai có thể được tham chiếu bởi các assembly bên ngoài.

Bạn có thể sử dụng một công cụ để giúp bạn tìm và loại bỏ các phương thức không sử dụng (bao gồm cả các phương thức chỉ được gọi bằng các phương pháp không sử dụng khác). Hãy thử What tools and techniques do you use to find dead code?Find unused code để giúp bạn bắt đầu.

0

Tôi nghi ngờ trình biên dịch sẽ xóa mọi thứ. Thực tế là, trình biên dịch không thể nói cái gì được sử dụng và cái gì không, vì các kiểu có thể được khởi tạo và các phương thức được gọi theo tên, nhờ vào sự phản chiếu.

6

Tất cả đều được biên dịch. Bất kể nó được gọi hay không. Mã này có thể được gọi bởi một thư viện bên ngoài.

Cách duy nhất để làm cho trình biên dịch bỏ qua mã là sử dụng Trình biên dịch Preprocessor của Trình biên dịch. Thông tin thêm về những người here.

+0

Nó chỉ có thể được gọi bởi một thư viện bên ngoài nếu nó là công cộng hoặc một thành viên được bảo vệ của một lớp công khai. –

0

Giả sử có thư viện lớp được gọi là Utility. Bạn đã tạo một dự án mới và thêm thư viện lớp này vào dự án đó. Ngay cả khi EXE của bạn chỉ gọi 1-2 phương thức từ thư viện lớp, bạn không nên xóa mã không được chấp nhận.

Nó sẽ đi ngược lại nguyên tắc tái sử dụng. Mặc dù thực tế rằng sẽ có một số lớp có mặt trong thư viện không được giải quyết từ EXE, nó sẽ không có bất kỳ tác động xấu đến hiệu suất hoặc kích thước của chương trình.

0

Xác định tất cả và chỉ có mã chết là (nếu một trong những lý tưởng mà người ta có một "thế giới toán học" như ngôn ngữ) đệ quy không thể xác định, trong hầu hết các ngôn ngữ. (Một số ít ngôn ngữ hiếm hoi như ngôn ngữ Blaise là có thể giải quyết được.)

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