2009-03-01 11 views
16

Tôi chỉ thấy nó đã được sử dụng trong một trong các câu trả lời gần đây:ngầm điều hành

public static implicit operator bool(Savepoint sp) 
{ 
    return sp != null; 
} 

Tại sao chúng ta cần từ ngầm ở đây, và điều đó có nghĩa là gì?

Trả lời

28

Ngụ ý nghĩa là chuyển đổi không yêu cầu truyền trong mã của bạn.

Bây giờ bạn có thể làm điều này:

Savepoint point = new Savepoint(); 
if(point) // becomes a bool using your operator 
{ 
} 

thay vì phải làm điều này:

Savepoint point = new Savepoint(); 
if((bool)point) // an "explicit" conversion 
{ 
} 

Một ví dụ về lý do tại sao đây là một sự phân biệt hữu ích là loại số. Có một chuyển đổi ngầm từ các loại "nhỏ" với các loại "lớn hơn", ví dụ:

float f = 6.5; 
double d = f; // implicit conversion 

Nhưng chuyển đổi loại lớn hơn để loại nhỏ hơn có thể nguy hiểm, vì vậy chỉ có một chuyển đổi rõ ràng, buộc người sử dụng để làm rõ rằng ông thực sự dự định thực hiện thao tác được đề cập:

long l = 20; 
// short s = l; 
short s = (short)l; // explicit conversion 
+0

Bạn có các từ được trộn lẫn trong các số rõ ràng. "chuyển đổi loại nhỏ hơn thành loại lớn hơn" nên là cách khác xung quanh. – Samuel

+0

Cảm ơn bạn. Tôi đã sửa lỗi của mình. – mquander

+0

float nhỏ hơn gấp đôi, phải không? – configurator

2

Chỉ để thêm vào câu trả lời của câu hỏi.

Từ đặc tả ngôn ngữ C# 3.0:

Tờ khai điều hành chuyển đổi bao gồm từ khóa implicit giới thiệu một chuyển đổi ngầm người dùng định nghĩa. Chuyển đổi ngầm định có thể xảy ra trong một số trường hợp khác nhau, , bao gồm lời gọi thành viên chức năng, biểu thức truyền và bài tập.

(phần 10.10.3)

0

Bạn cần phải xác định 'ngầm' vì cũng có nhà khai thác rõ ràng.

Điều này có nghĩa là chuyển đổi giữa Boolean và Savepoint có thể được thực hiện hoàn toàn, ví dụ: = ẩn.

Savepoint s = new Savepoint(); 
bool b = s; 

Chuyển đổi rõ ràng, ví dụ: hiển nhiên, có thể được thực hiện theo cách này:

Savepoint s = new Savepoint(); 
bool b = (bool)s; 

chuyển đổi ngầm thường được sử dụng khi không có mất mát dữ liệu có thể, ví dụ: Int16 (short)-Int32 (int). Nhưng nếu có thể, bạn cần phải 'đồng ý' với nó bằng cách sử dụng chuyển đổi rõ ràng.

Trong trường hợp của bạn, ví dụ, nếu Savepoint chỉ là một

struct Savepoint 
{ 
    public bool data; 
} 

bạn có thể sử dụng chuyển đổi ngầm, bởi vì không mất dữ liệu có thể:

Savepoint s = new Savepoint(); 
s.data = true; 
bool b = s; 

nếu không tôi khuyên bạn nên xác định rõ ràng nhà điều hành!

7

Điều đó có vẻ như lạm dụng một toán tử ngầm. Tôi không biết lớp Savepoint làm gì, nhưng chuyển đổi nó thành một boolean có vẻ không hợp lý. Nhà điều hành ngầm cho phép bạn kiểm tra xem một tài liệu tham khảo savepoint là null hay không bằng cách đơn giản đánh giá tham khảo:

if (point) { 

thay vì:

if (point != null) { 

Nếu nó được sử dụng như vậy, đó là che giấu những gì mã thực sự đang làm, và điều đó chống lại khá nhiều thứ mà C# nói đến.

+0

Điều này hoàn toàn chính xác. – mquander

1

Toán tử chuyển đổi chuyển đổi từ loại này sang loại khác. Ngụ ý có nghĩa là bạn không phải nhập một đoạn mã rõ ràng để mã chuyển đổi xảy ra, rõ ràng yêu cầu phải truyền mã để được gọi.

Bạn sử dụng toán tử chuyển đổi ngầm khi bạn chắc chắn rằng chuyển đổi không mất bất kỳ dữ liệu nào. Ví dụ, với việc ép buộc mở rộng (int -> long, float -> double). Các toán tử chuyển đổi rõ ràng được sử dụng khi một số trạng thái bị mất hoặc bạn không muốn trình biên dịch tự động sửa mã khách hàng bằng cách chèn các chuyển đổi trên toàn bộ địa điểm.

Một chuyển đổi như của bạn thực sự sẽ tàn phá vì không thể thực hiện chuyển đổi cụ thể này.