2011-10-10 33 views
8

Có một lớp học SafeHandleZeroOrMinusOneIsInvalid trong Khuôn khổ .NET, cũng như lớp SafeHandleMinusOneIsInvalid.Số không bao giờ là một xử lý hợp lệ?

Tại sao điều này? Trong đó tình huống nào là không bao giờ là một xử lý hợp lệ?

+0

Tôi sẽ tưởng tượng rằng ngày nay không bao giờ là một xử lý hợp lệ; ngay bây giờ tôi đang tìm trong Process Explorer trên Windows 7 và xử lý các giá trị bắt đầu từ 4 (Image File Execution Options key registry, thú vị). Tôi nghi ngờ nó là từ thời gian trước khi thời gian mà có lẽ một số chức năng Win16 hoặc DOS cổ đại đã mở một tập tin có thể trở lại một xử lý hoặc mô tả với một giá trị bằng không. Hôm nay, 0 và -1 là các giá trị không hợp lệ đặc biệt vì vậy tôi không thể tưởng tượng bạn sẽ có được một xử lý hợp lệ với một trong hai giá trị. Bạn có thể kiểm tra các API .NET sử dụng SafeHandleMinusOneIsInvalid; có lẽ điều đó sẽ cho bạn một số gợi ý. – Luke

+0

@Luke: Có lẽ ... nhưng ngay cả khi đó, tại sao họ lại quan tâm đến Win16/DOS khi họ thiết kế SafeHandle trong .NET 2.0? – Mehrdad

+0

Có lẽ không có liên kết trực tiếp, nhưng mọi thứ được xây dựng trên đầu trang của mọi thứ khác để tương thích ngược là một cân nhắc quan trọng. .NET 2.0 chạy trên Windows 98, bạn biết đấy; đó là loại ấn tượng khi bạn nghĩ về nó. – Luke

Trả lời

6

Làm bài giảng bổ sung cho các câu trả lời khác, xem this OldNewThing blog entry về các giá trị trả về không phù hợp.

+0

Bạn nên xây dựng, không chỉ qua một liên kết. – tenfour

+0

Bạn hoàn toàn đúng. Cảm thấy tự do để chỉnh sửa câu trả lời của tôi, nếu bạn nghĩ rằng bất cứ điều gì là mất tích. Trong thực tế, tôi thậm chí đã đăng rằng đó là bình luận, vì nó không trả lời chính xác câu hỏi. Nhưng tôi đã bỏ lỡ mười điểm của mình: D.Ngoài ra tôi không muốn ngăn không cho ai phát hiện ra blog tuyệt vời của Raymond (và tôi chỉ có thể sao chép văn bản từ đó, dường như lãng phí thời gian cho tôi) – MartinStettner

+0

@MartinStettner: Đó là một liên kết được thừa nhận tốt, nhưng điều đó không nói bất kỳ thứ gì về trình bao bọc .NET, tức là tại sao 'SafeHandleMinusOneIsInvalid' tồn tại. 1 anyway, nhưng tôi nghi ngờ tôi sẽ chấp nhận điều này. : P – Mehrdad

3

Có. Zero là tập tin xử lý cho stdin. Các chốt không phải hạt nhân không hợp lệ nếu không.

+0

http://en.wikipedia.org/wiki/File_descriptor – mellamokb

+3

Trình xử lý tệp Win32 không giống với bộ mô tả tệp POSIX/C – jalf

+0

Việc truyền 0 đến ReadFile vẫn đọc STDIN. – Joshua

3

Như đưa ra bởi Microsoft trong documentation của họ (và chứng minh trong mô tả bởi Joshua,) đó là thực hiện phụ thuộc, có thể nói:

Nó mô tả định dạng của một xử lý không hợp lệ.

Ví dụ, một số xử lý sử dụng -1 là một giá trị xử lý không hợp lệ, trong khi những người khác sử dụng 0. Thêm dẫn xuất của lớp này (ví dụ: tệp hoặc thanh ghi đăng ký) có thể chuyên thêm này. Xem lớp SafeFileHandle để biết ví dụ của một lớp có nguồn gốc từ SafeHandleZeroOrMinusOneIsInvalid.

+0

Điều thú vị là làm cho SafeFileHandle * sai *. – Joshua

+2

Điều đó vẫn không nói khi nào số không ** hợp lệ ** như một tay cầm ... – Mehrdad

1

Tôi nghĩ rằng bạn đang đọc quá nhiều vào tên: tất cả điều này có nghĩa là một số API theo quy ước trả về 0 để chỉ báo lỗi, số khác trả về -1. Đối với một API trả về -1, điều này không có nghĩa là 0 sẽ là một xử lý hợp lệ, chỉ cần API trả về -1 để biểu thị sự thất bại.

Vì vậy, điều này thực sự về giá trị thường được API sử dụng để chỉ báo lỗi; nó không nói bất cứ điều gì về việc liệu bất kỳ giá trị xử lý nào khác có hợp lệ hay không cho bất kỳ tập hợp API nào đã cho.

+0

OK có thể, nhưng sau đó làm thế nào đến đó không phải là một lớp 'SafeHandleZeroIsInvalid'? Chắc chắn có nhiều hơn * nhiều * API trả lại 0 dưới dạng giá trị không hợp lệ thay vì -1? – Mehrdad

+1

Vấn đề chính là cùng một lớp xử lý cần phải làm việc với * cả hai * loại API. "Zero * hoặc * Minus One" trong trường hợp này có nghĩa là * cả hai * được coi là không hợp lệ - không phải * hoặc là/hoặc *. Điều này cho phép cùng một lớp cơ sở được sử dụng với API CreateFile (trả về INVALID_HANDLE_VALUE về lỗi) như với CreateMutex (trả về NULL khi thất bại). Tại sao có hai lớp cơ sở riêng biệt (có thể gây nhầm lẫn và lỗi nếu người dùng chọn sai) khi người dùng có thể xử lý cả hai trường hợp? – BrendanMcK

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