2009-05-23 30 views
11

Nếu bạn có đối tượng Bitmap cần được truyền cho nhiều phương thức (khoảng 10) và cuối cùng là sự kiện cuối cùng sẽ được xử lý sau khi được sử dụng, nó sẽ là (hiệu suất khôn ngoan) có lợi để truyền nó cho mỗi một trong những phương pháp đó bằng cách tham chiếu thay vì giá trị?Từ khóa C# 'ref', hiệu suất

Đi qua giá trị, đối tượng được sao chép, chuyển theo tham chiếu của đối tượng đó.

(Hiệu suất rất quan trọng trong tình huống này. Ứng dụng cần chạy nhanh nhất có thể.)

+0

vb.net: [đó là nhanh hơn-byval-or-byref] (http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref) – nawfal

+0

Hiện có cách làm thế nào người ta có thể vượt qua một Bitmap theo giá trị. – IllidanS4

Trả lời

30

Bitmap là loại tham chiếu. Việc chuyển kiểu tham chiếu theo giá trị không sao chép đối tượng, chỉ đơn thuần là tham chiếu đến đối tượng. Sẽ không có lợi ích hiệu suất nào khi truyền Bitmap theo tham chiếu thay vì theo giá trị.

7

Loại bạn đang sử dụng chính xác để giữ Bitmap? Ví dụ: System.Drawing.Bitmap là loại/lớp tham chiếu. Khi bạn chuyển một tham chiếu đến một phương thức (như một đối số), tham chiếu được truyền theo giá trị. (Bản sao tài liệu tham khảo được tạo ... không phải đối tượng) Vì vậy, bốn byte sẽ được cấp phát trên máy 32 bit để giữ bản sao.

Sử dụng từ khóa ref không mang nhiều hiệu suất ngoại trừ việc cùng một tham chiếu được chuyển (không sao chép một tham chiếu). Nó có những lợi ích sau

  • Chỉ xóa mục đích rằng phương pháp lấy tham số có thể sửa đổi nó, và người gọi có thể nhận được một giá trị bài thi sửa đổi.
  • Và biến phải được khởi tạo bởi callee trước khi được chuyển làm đối số cho hàm được gọi bằng tham số ref.
+0

Cảm ơn bạn đã gửi thêm chi tiết! –

+0

"Sử dụng từ khóa ref ... chỉ xóa mục đích". Ummm, tôi không nghĩ đó là sự thật. Một tham chiếu được truyền bởi byref (đối tượng **) có thể được thiết kế lại bởi người gọi; ảnh hưởng đến đối tượng mà người gọi trỏ đến. Việc truyền tham chiếu theo giá trị (đối tượng *) chuyển một bản sao tham chiếu, cô lập tham chiếu người gọi từ các thay đổi trong calle. Bài viết này http://preview.tinyurl.com/oda4jz có một ví dụ trong C#. – corlettk

+0

Chính xác. Do đó phương thức lấy tham số ref buộc người gọi viết rõ ràng ref trước đối số - để đảm bảo rằng người gọi hiểu và đồng ý với ngữ nghĩa. Nó làm rõ ý định rằng người gọi đang đi qua một đối số nhận thức đầy đủ rằng đối số có thể có một giá trị/trạng thái đăng bài gọi phương thức khác nhau. – Gishu

15

Vì Bitmap là kiểu tham chiếu nên không có sự khác biệt thực tế về hiệu suất trong trường hợp này vì nó đã được chuyển bằng tham chiếu đến phương thức.

Tôi muốn giới thiệu Jon Skeet's article on the subject để được giải thích kỹ lưỡng về cách "theo tham chiếu" và "theo giá trị" hoạt động trong C#.

+0

Cảm ơn bạn đã liên kết đến bài viết, thực sự đã giúp tôi. Đánh giá cao nó bud –

+0

Đề xuất bài viết hay. Đó là một cách tuyệt vời để đọc kỹ các loại giá trị/tham chiếu và tham số truyền theo giá trị/tham chiếu. –

5

'Ref' không tự chuyển đối tượng vào hàm, thay vào đó nó chuyển tham chiếu đến biến mà nó được lưu trữ trong/at.

Nếu đối tượng là một lớp hoặc giao diện, sau đó bất cứ khi nào bạn truy cập biến đó trong hàm, nó phải dereference nó, và sau đó truy cập vào biến. Nếu nó được thông qua mà không có từ khóa 'ref', thì nó sẽ không phải thực hiện bước dereference (do đó nó sẽ nhanh hơn một chút).

Nếu đối tượng là cấu trúc (hoặc enum hoặc loại cơ sở khác), từ khóa 'ref' chuyển tham chiếu tới biến lưu trữ cấu trúc, điều này vẫn khiến tốc độ SLIGHT của dereferencing bất cứ khi nào bạn sử dụng, nhưng nếu bạn không chỉ định nó, thì chương trình phải cấp phát bộ nhớ cho một thể hiện mới của cấu trúc và sau đó sao chép nó. Trong hầu hết các trường hợp, nhanh hơn để truyền các cấu trúc thông qua từ khóa ref, nhưng điều này có thể không phải là trường hợp nếu nó là một cấu trúc thực sự nhỏ, hoặc nếu nó dereferenced rất nhiều (và tôi có nghĩa là một LOT). Vì vậy, nếu bạn đang đi qua một cấu trúc, sau đó ref thường là con đường để đi, nếu không sẽ không thực sự có nhiều sự khác biệt (chi phí trong giai đoạn dereferencing là trừ đi).

Ồ, và để thực sự trả lời câu hỏi, Bitmap là một lớp, vì vậy từ khóa 'ref' sẽ không thực sự tạo sự khác biệt về tốc độ so với tham số không phải 'không'.

+0

+1 để chỉ ra lợi ích của việc đi qua tham chiếu cho cấu trúc và giải thích kỹ lưỡng hơn về tác động của dereferencing. – Didaxis

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