2011-08-12 6 views
5

Tôi đang tạo một ứng dụng quan trọng về hiệu suất thực hiện thao tác hình ảnh. Tôi đang sử dụng một số con trỏ pixel sử dụng cấu trúc của tôi có tên là Pixel để thực hiện một số thao tác. Tôi đã có rất nhiều phần mã lặp qua toàn bộ dữ liệu bitmap và vì lợi ích của khả năng tái sử dụng mã và mô đun, tôi đang thiết kế một phương thức sẽ thực hiện hành động và áp dụng nó cho tất cả các pixel của hình ảnh (như bản đồ chức năng). Tuy nhiên, khi tôi viết Action<Pixel*> Visual Studio phàn nàn về mã nói rằng loại Pixel* có thể không được sử dụng làm đối số loại. Cả lớp đều trong ngữ cảnh unsafe và tôi đang sử dụng các con trỏ Pixel ở mọi nơi, nhưng tôi không thể sử dụng con trỏ pixel làm lớp mẫu của Hành động.Sử dụng Action <PointerClass *> làm đối số

Tôi có thể sử dụng Action<IntPtr> nhưng tôi sẽ cần phải chuyển đổi nó thành con trỏ thích hợp bên trong phần thân phương thức trong MỌI lần lặp lại, điều này sẽ giết toàn bộ ý tưởng là "hiệu suất quan trọng".

+0

Thông báo lỗi chính xác? –

+0

'Loại 'Tools.Imaging.Pixel *' có thể không được sử dụng làm đối số kiểu ' –

+0

Tại sao không chỉ' Action ' –

Trả lời

8

Có vẻ như không có gì buộc bạn sử dụng Action<T>, vì vậy bạn có thể tạo loại đại biểu của riêng mình. Tôi không tìm ra một cách để làm điều này một cách chung chung, nhưng công trình này:

unsafe delegate void PixelAction(Pixel* ptr); 

Hãy ghi nhớ rằng nếu điều này thực sự là hiệu suất quan trọng, gọi một đại biểu là chậm hơn so với chỉ gọi một phương pháp trực tiếp. Có thể một cách khác có thể tốt hơn, giống như mã trùng lặp (nếu điều đó sẽ hoạt động trong trường hợp của bạn), hoặc tạo mã, hoặc tại thời gian biên dịch hoặc khi chạy bằng cách sử dụng Reflection.Emit hoặc CodeDOM.

+0

có. câu trả lời này làm cho tôi nghĩ như vậy :) làm việc với 'hành động' làm cho tôi quên đại biểu thường xuyên hoàn toàn, tôi sẽ cố gắng để thực hiện điều này. –

1

Loại con trỏ không phải là lớp và do đó chúng không thể được sử dụng làm đối số loại chung.

Tôi nghĩ cách tiếp cận duy nhất của bạn là xác định Action <IntPtr> và truyền khi cần thiết ở cả hai bên. Tôi không nghĩ rằng hiệu suất hit sẽ là xấu như bạn nghĩ khi biên dịch với tối ưu hóa.

EDIT: Hóa ra bên dưới có vẻ không hoạt động (CS0208)

Dù rằng, hoặc thay vì sử dụng Action <T> xác định loại đại biểu của riêng bạn có thể làm việc:

delegate void PointerAction<T>(T* ptr); 

+1

Điều đó dường như không hoạt động: “Con trỏ và bộ đệm kích thước cố định chỉ có thể được sử dụng trong bối cảnh không an toàn”. Nếu tôi thêm 'unsafe', thì:" Không thể lấy địa chỉ, lấy kích thước, hoặc khai báo một con trỏ tới một kiểu được quản lý ('T') ". – svick