Khi sử dụng PInvoke, tôi nhận thấy rằng chúng tôi cần sử dụng IntPtr
để tham khảo các chốt Windows. Tôi tự hỏi tại sao không chỉ sử dụng int
để xử lý? Sự hiểu biết của tôi về một xử lý là nó chỉ là một giá trị số nguyên.Tại sao sử dụng IntPtr để xử lý?
Trả lời
Tay cầm cửa sổ được định nghĩa là một số nguyên của kích thước con trỏ máy gốc. Đó là để họ có thể bí mật trở thành một con trỏ nếu họ cần. (Một tay cầm có lẽ là không phải là con trỏ, nhưng nó là được phép là một trong những hệ điều hành mà những người triển khai thực hiện cho thấy cần thiết. Chúng thường không thực sự là con trỏ vì lý do bảo mật; nếu chúng thực sự là con trỏ.)
Một int trong C# được định nghĩa là số nguyên 32 bit, sẽ quá nhỏ trên máy 64 bit. IntPtr được định nghĩa là một số nguyên có thể giữ con trỏ của kích thước máy. Đó là lý do tại sao bạn luôn sử dụng IntPtr khi tương tác với các tay cầm.
Xử lý là giá trị con trỏ có kích thước.
Chúng rộng 8 byte trên nền tảng 64 bit.
Tôi muốn nói "pointer- * sized *" thay vì "pointer" (mặc dù tôi đoán theo nghĩa C/C++ nghiêm ngặt, điều đó không quá chính xác, vì các xử lý là 'typedef''d như một con trỏ, và' size_t' không nhất thiết phải là kích thước của một con trỏ) ... nhưng nếu chúng là các chỉ mục vào một bảng, rất có thể chúng được sử dụng như các số nguyên. Nhưng vâng, lấy đi. – Mehrdad
Ý tưởng hay; ăn cắp – SLaks
Trình xử lý cơ bản là con trỏ mức hệ thống và con trỏ không được đúc hoàn toàn vào int. Nó là một loại của chính nó. Vì vậy, đó là lý do tại sao bạn có IntPtr
trong .NET để đại diện cho loại Xử lý.
Kích thước của tay cầm phụ thuộc vào kiến trúc máy (32/64 bit). IntPtr
sẽ giải quyết vấn đề đó.
- 1. Tại sao IntPtr không cần từ khóa không an toàn?
- 2. Tại sao nhân Linux sử dụng cổng bẫy để xử lý ngoại lệ divid_error?
- 3. Tại sao đối tượng được xử lý không ném ngoại lệ khi sử dụng nó sau khi xử lý?
- 4. Sao chép dữ liệu từ từ IntPtr sang IntPtr
- 5. Tại sao sử dụng Trình xử lý trong khi runOnUiThread cũng giống vậy?
- 6. Tôi có thể sử dụng SafeHandle thay vì IntPtr không?
- 7. Sử dụng câu lệnh "sử dụng" để xử lý
- 8. Tại sao ai đó sử dụng chỉ thị tiền xử lý #if 1 C?
- 9. Android - Tại sao sử dụng các tham chiếu đang chờ xử lý cho geofences
- 10. Tại sao trình xử lý sự kiện này sử dụng "e = e || event"?
- 11. Tại sao REPL xử lý clojure.core/doc dưới dạng var?
- 12. Tại sao PreviewTextInput không xử lý dấu cách?
- 13. Tại sao MySQL xử lý é giống như e?
- 14. Tại sao SqlConnection không được xử lý/đóng?
- 15. Tại sao việc xử lý ngoại lệ từ CloseHandle khác nhau giữa .NET 4 và 3.5?
- 16. Nhận cửa sổ xử lý (IntPtr) từ cửa sổ hiện tại của trình duyệt web Selenium GUID
- 17. JPA lý do tại sao sử dụng createNamedQuery
- 18. Tại sao vba doesnt xử lý Lỗi 2042
- 19. VS8 không thể xử lý file.close(); file.open() ;, tại sao?
- 20. Tại sao Hộp cát Paypal không xử lý thanh toán?
- 21. Xử lý Mảng tại Gò
- 22. Tại sao tôi không thể xử lý KeyboardInterrupt trong python?
- 23. Tại sao RSS không thể xử lý dấu và?
- 24. Sử dụng mô-đun đa xử lý
- 25. PicklingError khi sử dụng đa xử lý
- 26. Tại sao sử dụng mysqli_close()?
- 27. Xử lý ép chính sử dụng swt
- 28. Ghi nhật ký đa xử lý Python - lý do tại sao multiprocessing.get_logger
- 29. Sử dụng jquery bấm vào để xử lý neo onClick()
- 30. Cách hiểu lý do tại sao khối xử lý ruby ở 100% CPU
Việc bạn phạm sai lầm phổ biến nhất gây ra sự không tương thích x64. – SLaks
Chắc chắn, chúng là giá trị số nguyên. Nhưng không ai nói rằng họ phải là 32 bit ... – Mehrdad