Tại sao loại bỏ các chỉ thị sử dụng không sử dụng trong C #?


120

Tôi tự hỏi liệu có bất kỳ lý do nào (ngoài việc thu dọn mã nguồn) tại sao các nhà phát triển sử dụng tính năng "Loại bỏ không sử dụng Usings" trong Visual Studio 2008 không?


Tôi tin rằng đó là một tính năng của PowerCommands dành cho Visual Studio, không phải của chính Visual Studio.
Hosam Aly

3
Trong VS2008, nó chắc chắn là một tính năng (cùng với khả năng sắp xếp các câu lệnh sử dụng) của chính VS.
Richard

1
@Hosam: PowerCommands cho phép bạn làm điều đó cho toàn bộ dự án / giải pháp. Thực hiện điều đó trên mỗi tệp là một tính năng của chính VS.
cấu hình

3
BTW, hãy xem Resharper nếu bạn muốn kiểm soát chính xác hơn loại dọn dẹp này.
John Feminella

2
Tôi thực sự không thích tính năng này - tôi luôn thấy mình đang chỉnh sửa tệp và phải thêm lại tất cả các không gian tên Hệ thống sau khi ai đó đã dọn sạch chúng (thường là System, System.Collections.Generic và System.Linq.) Tôi thấy nó bổ sung thêm nhiều ma sát hơn nó tiết kiệm. Bây giờ, không gian tên dự án của riêng bạn chứ không phải không gian tên khung - những không gian tên này có ý nghĩa hơn để dọn dẹp, để làm rõ hệ thống dây của chương trình của bạn. Ước gì có một cách nào đó để VS dọn dẹp quá trình nhập chỉ từ một số không gian tên nhất định và để lại những Hệ thống mà bạn thường xuyên cần hơn.
user1454265

Câu trả lời:


186

Có một số lý do bạn muốn loại bỏ chúng.

  • Nó là vô nghĩa. Chúng không có giá trị gì.
  • Thật khó hiểu. Điều gì đang được sử dụng từ không gian tên đó?
  • Nếu không, bạn sẽ dần dần tích lũy các usingcâu lệnh vô nghĩa khi mã của bạn thay đổi theo thời gian.
  • Phân tích tĩnh chậm hơn.
  • Quá trình biên dịch mã chậm hơn.

Mặt khác, không có nhiều lý do để xóa chúng. Tôi cho rằng bạn tiết kiệm cho mình công sức xóa chúng. Nhưng nếu bạn lười biếng như vậy, bạn sẽ gặp vấn đề lớn hơn!


59
Một lập trình viên giỏi LÀ lười biếng, anh ta tối đa hóa công việc KHÔNG ĐƯỢC LÀM. : D
Nicolas Dorier

34
Tôi không đồng ý rằng một lập trình viên giỏi là lười biếng, nhưng tôi đồng ý với quan điểm của câu nói của bạn. Một lập trình viên giỏi sẽ xóa chúng để giữ cho mã của mình sạch sẽ và do đó tránh được công việc / sự cố / vấn đề trong tương lai cho chính mình và người khác.
Allan

2
Đúng, đó là một liên kết tuyệt vời. Tôi đoán quan điểm của tôi chỉ là chúng ta muốn "lười tốt" hơn là "lười biếng"; thứ hai là nơi các lập trình viên không thể bận tâm để viết mã tốt.
Allan

5
Cũng có ích khi để lại các không gian tên tiêu chuẩn. Đối với các dự án và nhóm lớn, việc để lại chúng dẫn đến ít xung đột hợp nhất tiềm năng hơn và ít tệp để xem xét mã hơn. Ngoài ra, rất nhiều nhà phát triển thêm các phương thức mở rộng khó hiểu và khó tìm vào mọi thứ, và đôi khi việc định vị các không gian tên cần thiết cho các phương thức mở rộng này là một rắc rối. Các nhà phát triển mới có thể đã quen với việc có System.Linq, bao gồm trong các tệp mã của họ và lãng phí nhiều thời gian để tìm ra lý do tại sao một số phương pháp nhất định không khả dụng trước khi yêu cầu trợ giúp.
Đánh dấu tại Ramp51

5
Bạn có thể muốn giữ một số trong số chúng để ngăn intellisense khỏi bị câm như một địa ngục trong quá trình viết mã trong tương lai.
yazanpro

24

Tôi sẽ nói hoàn toàn ngược lại - việc loại bỏ các câu lệnh sử dụng không cần thiết, không cần thiết là vô cùng hữu ích.

Hãy tưởng tượng bạn phải quay lại mã của mình sau 3, 6, 9 tháng - hoặc người khác phải tiếp quản và duy trì mã của bạn.

Nếu bạn có một danh sách dài khổng lồ về câu lệnh sử dụng không thực sự cần thiết, thì việc nhìn vào mã có thể khá khó hiểu. Tại sao điều đó được sử dụng trong đó, nếu không có gì được sử dụng từ không gian tên đó ??

Tôi đoán về khả năng bảo trì lâu dài trong một môi trường chuyên nghiệp, tôi thực sự khuyên bạn nên giữ cho mã của bạn sạch nhất có thể - và điều đó bao gồm cả việc loại bỏ những thứ không cần thiết khỏi nó. Ít lộn xộn hơn đồng nghĩa với ít nhầm lẫn hơn và do đó khả năng bảo trì cao hơn.

Marc


14

Đối với tôi, đây có vẻ là một câu hỏi rất hợp lý, được những người trả lời đối xử một cách khá phiến diện.

Tôi muốn nói rằng bất kỳ thay đổi nào đối với mã nguồn cần phải được xác minh. Những thay đổi này có thể có chi phí ẩn và người đặt câu hỏi muốn được biết về điều này. Họ không yêu cầu được gọi là "lười biếng", như một người đã thống nhất.

Tôi vừa mới bắt đầu sử dụng Resharper và nó đang bắt đầu đưa ra các cảnh báo và gợi ý về phong cách cho dự án mà tôi chịu trách nhiệm. Trong số đó là việc loại bỏ chỉ thị sử dụng thừa, ngoài ra còn có các định tính thừa, viết hoa và nhiều thứ khác. Bản năng ruột của tôi là làm gọn mã và giải quyết tất cả các gợi ý, nhưng người đứng đầu doanh nghiệp của tôi cảnh báo tôi trước những thay đổi không chính đáng.

Chúng tôi sử dụng quy trình xây dựng tự động và do đó bất kỳ thay đổi nào đối với kho lưu trữ SVN của chúng tôi sẽ tạo ra các thay đổi mà chúng tôi không thể liên kết với các dự án / lỗi / sự cố và sẽ kích hoạt các bản dựng và bản phát hành tự động không mang lại thay đổi chức năng cho các phiên bản trước.

Nếu chúng ta xem xét việc loại bỏ các vòng loại dư thừa, điều này có thể gây ra nhầm lẫn cho các nhà phát triển vì các lớp Miền và lớp Dữ liệu của chúng tôi chỉ được phân biệt bởi các vòng loại.

Nếu tôi xem xét việc sử dụng thích hợp cách viết hoa của các từ đồng nghĩa (tức là ABCD -> Abcd) thì tôi phải tính đến việc Resharper không cấu trúc lại bất kỳ tệp Xml nào mà chúng tôi sử dụng tên lớp tham chiếu đó.

Vì vậy, việc làm theo những gợi ý này không hề đơn giản như nó xuất hiện, và cần được đối xử một cách tôn trọng.


6
Điểm tốt, nhưng bạn cũng không nên quên rằng việc sử dụng mã sạch không phức tạp sẽ tăng cường khả năng bảo trì, đây cũng là một mục tiêu kinh doanh. Bạn phải cân cả hai. Lý tưởng nhất là bạn muốn thực hiện các loại tái cấu trúc này ngay sau khi phát hành để bạn có thể có một phương tiện chặn sạch nhất có thể để bắt đầu một trang mới và có nhiều thời gian để nắm bắt các lần hồi quy cuối cùng.
David Reis

14

Ngoài những lý do đã được đưa ra, nó ngăn chặn các xung đột đặt tên không cần thiết. Hãy xem xét tệp này:

using System.IO;
using System.Windows.Shapes;

namespace LicenseTester
{
    public static class Example
    {
        private static string temporaryPath = Path.GetTempFileName();
    }
}

Mã này không biên dịch vì cả hai không gian tên System.IO và System.Windows.Shapes đều chứa một lớp được gọi là Đường dẫn. Chúng tôi có thể sửa nó bằng cách sử dụng đường dẫn lớp đầy đủ,

        private static string temporaryPath = System.IO.Path.GetTempFileName();

hoặc chúng tôi có thể chỉ cần xóa dòng using System.Windows.Shapes;.


13

Ít tùy chọn hơn trong cửa sổ bật lên Intellisense (đặc biệt nếu không gian tên chứa nhiều phương thức Mở rộng).

Về mặt lý thuyết, Intellisense cũng sẽ nhanh hơn.


1
+1 cho intellisense. Nó thực sự chậm khi khởi động (tôi thường thấy "Tạo bộ nhớ cache, thử lại sau"), vì vậy điều này thực sự có ý nghĩa. Tổng hợp thời gian mà mọi người khác nói về ... tôi vẫn chưa thấy con số.
Luc

5

Loại bỏ chúng. Ít mã để xem và băn khoăn về tiết kiệm thời gian và sự nhầm lẫn. Tôi ước nhiều người hơn sẽ GIỮ ĐƯỢC NHỮNG ĐIỀU ĐƠN GIẢN, NHANH CHÓNG và THẬT SỰ. Nó giống như có áo sơ mi và quần bẩn trong phòng của bạn. Nó xấu xí và bạn phải tự hỏi tại sao nó ở đó.


4

Nó cũng giúp ngăn chặn sự phụ thuộc vòng tròn sai, giả sử bạn cũng có thể xóa một số tham chiếu dll / dự án khỏi dự án của mình sau khi loại bỏ các phần không sử dụng.


3

Mã biên dịch nhanh hơn.


5
Có bằng chứng nào để sao lưu điều đó không?
cjk

14
Oh CK - bạn lại bắt được tôi. Tôi đã nói dối. Loại bỏ văn bản không cần thiết thực sự làm cho quá trình biên dịch mã chậm hơn. Hãy suy nghĩ về nó :)
Tài khoản chết

@ck: Tôi đã xác minh rằng việc xóa các câu lệnh sử dụng không được sử dụng khỏi một dự án tại nơi làm việc đã cải thiện thời gian biên dịch đáng kể. Tất nhiên nó sẽ - ít byte hơn để đọc từ ổ cứng.
cấu hình

19
Sẽ rất tuyệt khi thấy một số thống kê thực tế. Nếu chúng ta chỉ tiết kiệm được vài mili giây trong khi biên dịch, thì tốc độ không phải là một đối số thuyết phục. Tuy nhiên, có những lý do khác để loại bỏ các câu lệnh sử dụng không cần thiết.
Greg,

3
Không phải là nói dối hay không. Bất kỳ người nhạy cảm nào sẽ đoán rằng ít lộn xộn hơn có nghĩa là hiệu quả hơn. "Bằng chứng" để sao lưu nó là cung cấp giá trị cho phản hồi của bạn và hỗ trợ lập luận rằng "nhanh hơn" không có nghĩa là chỉ vài mili giây, mà thực sự là một trải nghiệm được cải thiện để biên dịch dự án của bạn nhanh hơn.
Matheus Felipe

3

Gần đây, tôi có một lý do khác tại sao việc xóa các mục nhập không sử dụng lại khá hữu ích và quan trọng.

Hãy tưởng tượng bạn có hai tập hợp, trong đó một tập hợp tham chiếu đến tập hợp kia (bây giờ chúng ta hãy gọi cái đầu tiên Avà cái được tham chiếu B). Bây giờ khi bạn có mã ở A phụ thuộc vào B thì mọi thứ đều ổn. Tuy nhiên ở một số giai đoạn trong quá trình phát triển của bạn, bạn nhận thấy rằng bạn thực sự không cần mã đó nữa nhưng bạn để nguyên câu lệnh using. Bây giờ bạn không chỉ có using-directive vô nghĩa mà còn có một assembly-tham chiếu đến Bmà không được sử dụng ở bất kỳ đâu ngoài chỉ thị đã lỗi thời. Điều này trước hết làm tăng lượng thời gian cần thiết để biên dịch A, nhưB cũng phải tải.

Vì vậy, đây không chỉ là vấn đề về mã sạch hơn và dễ đọc hơn mà còn về việc duy trì tham chiếu lắp ráp trong mã sản xuất, nơi không phải tất cả các tập hợp tham chiếu đó đều tồn tại .

Cuối cùng, chúng tôi phải gửi B và A cùng nhau, mặc dù B không được sử dụng ở bất kỳ đâu trong A mà trong using-section. Điều này sẽ ảnh hưởng lớn đến thời gian chạy -performance của Akhi tải lắp ráp.


2

Ít nhất về lý thuyết, nếu bạn được cung cấp tệp C # .cs (hoặc bất kỳ tệp mã nguồn chương trình đơn lẻ nào), bạn sẽ có thể xem mã và tạo môi trường mô phỏng mọi thứ mà nó cần. Với một số kỹ thuật biên dịch / phân tích cú pháp, bạn thậm chí có thể tạo một công cụ để làm điều đó tự động. Nếu điều này ít nhất do bạn thực hiện, bạn có thể đảm bảo rằng bạn hiểu mọi thứ mà tệp mã nói.

Bây giờ, hãy xem xét, nếu bạn được cung cấp tệp .cs có 1000 using chỉ thị mà chỉ có 10 chỉ thị thực sự được sử dụng. Bất cứ khi nào bạn nhìn vào một biểu tượng mới được giới thiệu trong mã liên quan đến thế giới bên ngoài, bạn sẽ phải trải qua 1000 dòng đó để tìm ra nó là gì. Điều này rõ ràng là làm chậm quá trình trên. Vì vậy, nếu bạn có thể giảm chúng xuống 10, nó sẽ hữu ích!

Theo ý kiến ​​của tôi, usingchỉ thị C # rất yếu, vì bạn không thể chỉ định ký hiệu chung duy nhất mà tính chung chung bị mất và bạn không thể sử dụng usingchỉ thị bí danh để sử dụng các phương thức mở rộng. Đây không phải là trường hợp của các ngôn ngữ khác như Java, Python và Haskell, trong các ngôn ngữ đó, bạn có thể chỉ định (gần như) chính xác những gì bạn muốn từ thế giới bên ngoài. Nhưng nếu có, tôi sẽ đề nghị sử dụng usingbí danh bất cứ khi nào có thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.