2013-04-23 26 views
5

giả sử tôi có nhóm sau các chức năng tĩnhmà là tốt hơn trong trường hợp này, trả lại hoặc ref

đây tôi gửi các biến bằng cách tham khảo:

public static void ProcessEmailMessage(ref string HTML) 
     { 
      ModifyLinks(ref HTML); 
      AddFakeImage(ref HTML); 
     } 

     public static void ModifyLinks(ref string HTML) 
     { 
      //modify HTML links 
     } 


     public static void AddFakeImage(ref string HTML) 
     { 
      //adds an image to the HTML 
     } 

và ở đây tôi gửi các biến bằng giá trị

public static string ProcessEmailMessage(string HTML) 
     { 
      HTML = ModifyLinks(HTML); 
      HTML = AddFakeImage(HTML); 
      return HTML; 
     } 

     public static string ModifyLinks(string HTML) 
     { 
      //modify HTML links 
      return HTML; 
     } 


     public static string AddFakeImage(string HTML) 
     { 
      //adds an image to the HTML 
      return HTML; 
     } 

cái nào có ý nghĩa hơn và có sự khác biệt về hiệu suất giữa 2 không?

+2

** b) ** ......... – I4V

Trả lời

8

Tránh sử dụng các tham số ngoài và tham số nếu có thể.

Phương pháp lấy tham số ref và out có nhiều ưu điểm hơn để sử dụng, bạn cần khai báo biến để giữ kết quả và ngữ nghĩa hơi khó hiểu hơn. Sự khác biệt về hiệu suất (nếu có) sẽ không đáng kể.

Phân tích mã trong Visual Studio có thể sẽ phát ra cảnh báo cho việc sử dụng trong trường hợp này.

Xem http://msdn.microsoft.com/en-us/library/ms182131 để biết mô tả chi tiết hơn.

+1

Liên kết tới tài liệu bên ngoài là tốt, nhưng bạn nên bao gồm tóm tắt tại đây. Các câu trả lời SO vẫn hữu ích nếu liên kết bên ngoài bị gián đoạn. – cdhowie

+0

@cdhowie: Cảm ơn bạn đã chỉ ra điều này. Tôi đã chỉnh sửa bài đăng để bao gồm nhiều hơn một chút về bản tóm tắt. – DeCaf

2

Có khả năng sẽ có nhiều lượt truy cập hiệu suất hơn khi sử dụng ref, vì điều này dẫn đến mức độ gián đoạn bổ sung khi gán cho biến. Tuy nhiên, sự khác biệt này có thể là không đáng kể.

Tôi muốn các hình thức mà trả về một chuỗi, vì đây là minh họa nhiều hơn những gì đang thực sự xảy ra, và cho phép bạn phương pháp chuỗi gọi với nhau nếu bạn thích:

return AddFakeImage(ModifyLinks(HTML)); 

Với hình thức ref bạn buộc mã gọi để khai báo biến và có thể không cần phải thay đổi. Điều này cản trở khả năng đọc và tăng tỷ lệ mã boilerplate vô nghĩa.

+0

Về mặt kỹ thuật, một biến được khai báo trong cả hai trường hợp, đó chỉ là câu hỏi liệu người lập trình có cần biết về nó hay không. Trong mẫu mã bạn đã cung cấp, có một biến cục bộ ẩn chưa xác định tồn tại. Bây giờ, điều đó nói rằng, thật tuyệt khi không cần phải biết về nó, nhưng từ quan điểm hiệu suất, nó không thực sự khác biệt. – Servy

+0

@Servy Sẽ có một thanh ghi khi được biên dịch JIT, nhưng ví dụ mã tôi đã hiển thị sẽ khai báo một địa phương ít hơn mã gốc. Chữ viết tắt IL sẽ là 'ldarg.0; gọi điện; gọi điện; ret; '. Vì vậy, không, không có "biến bổ sung", ít nhất là không cho đến khi dịch sang mã gốc. (Và các biến không thực sự tồn tại trong mã gốc, chỉ đăng ký và vị trí bộ nhớ. Khái niệm về biến là cấp cao hơn mã gốc.) – cdhowie

+0

Trong cả hai trường hợp, cho dù có tên địa phương hay không, khi bạn truy cập mức độ hướng dẫn xử lý thực tế, cả hai đều có khả năng được đăng ký, nhưng cả hai đều có khả năng được lưu trữ ở một số vị trí trong bộ nhớ nếu không thể. – Servy

1

Sự khác biệt về hiệu suất giữa hai điều này là không đáng kể. Nó hoàn toàn là vấn đề sở thích cú pháp.

Quy ước tiêu chuẩn sẽ liên quan đến việc trả lại chuỗi mới thay vì sửa đổi thông số được chuyển bởi tham chiếu. Có một vài trường hợp dễ sử dụng hơn (cụ thể là khi bạn không có biến được đặt tên, ví dụ: khi bạn muốn chuyển giá trị trả về của phương thức hoặc thuộc tính thay vì trường).

1

Không có nhiều sự khác biệt nhưng tôi muốn dùng "return". Hãy thử tránh "ref" nếu có thể.

Lý do là bạn sẽ không phải khai báo một biến trước khi đi qua kết quả của một cuộc gọi khác và bạn có thể gọi chuỗi:

với ref:

string modifyMe = GetMeString(); 
ModifyLints(ref modifyMe); 
AddFakeImage(ref modifyMe); 

so với trở:

string result = AddFakeImage(ModifyLinks(GetMeString())); 
1

Nếu bạn cần trả lại một số đối tượng sử dụng ref/out, nếu bạn có thể làm điều đó với return chỉ cần trả về một obj ect, sử dụng return.
ref làm cho mã của bạn không nhất thiết bị che khuất và tạo ra chi phí viết không cần thiết trong trường hợp này.
Bạn nên luôn cố gắng giữ mã của mình đơn giản và có thể xem được.

1

tôi thích một cái gì đó giống như một người xây dựng mà không:.

EmailMessageProcessor (html) .WithModifiedLinks mới() WithFakeImages().

Vì vậy, không có đối số ref nào và mọi thứ được đóng gói.

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