2009-03-31 42 views

Trả lời

68

Sự khác biệt là:

  • Nếu một dàn diễn viên thất bại, nó ném một InvalidCastException.
  • Nếu toán tử as không thành công, nó sẽ trả về một tham chiếu null.
  • Bạn không thể sử dụng as với các loại giá trị không thể vô hiệu (ví dụ: bạn không thể làm "o as int").
  • Toán tử truyền cũng được sử dụng để hủy hộp. (as có thể được sử dụng để unbox thành một loại giá trị nullable.)
  • Toán tử truyền cũng có thể thực hiện chuyển đổi do người dùng xác định.

EDIT: Tôi đã written elsewhere khi tôi cảm thấy thích hợp khi sử dụng toán tử nào. Điều đó có thể đáng để đọc ...

+1

Hãy để tôi cập nhật mã của tôi Jon với loại tham chiếu. – Xaisoft

+0

Không cần nhiều - Tôi đã giải thích thêm trong câu trả lời của tôi bây giờ :) –

+0

Cảm ơn rất nhiều, tôi thực sự đã cập nhật nó với GridView, nhưng câu trả lời của bạn là đủ tốt. – Xaisoft

1

Nếu bạn sử dụng loại tham chiếu nói Bảng đầu tiên sẽ tăng InvalidCastException trong trường hợp o không thể gán cho Bảng và thứ hai sẽ trả về giá trị rỗng.

2

Nói chung, sự khác biệt giữa một diễn viên tĩnh và "như", là diễn viên sẽ ném một ngoại lệ nếu nó không thành công, trong khi "như" sẽ chỉ đặt biến thành null.

2

Câu lệnh "as" về cơ bản cố gắng truyền biến và trả về null nếu nó không thành công thay vì ném một ngoại lệ. Như vậy, giá trị mà bạn đang truyền phải là nullable - một kiểu tham chiếu hoặc một nguyên thủy nullable. Trong ví dụ của bạn, bạn phải làm:

int? i2 = o as int; 

hoặc nó sẽ không biên dịch.

2

Dàn diễn viên an toàn như

variable as type 

không giống như

(variable is type) ? (type)variable : (type)null 

và sẽ không làm việc với nhiều loại giá trị.

1

Ngoài vấn đề mà Jon đã chỉ ra, từ khóa as có hiệu quả phôi oSomeClass. Nếu o không có nguồn gốc từ SomeClass, nó trả về null. Trong khi một diễn viên đơn giản sẽ ném một ngoại lệ.

SomeClass i2 = o as SomeClass; 

trở thành

SomeClass i2; 
if (o is SomeClass) 
    i2 = (SomeClass)o; 
else 
    i2 = null; 
8

gì không được đề cập trong các câu trả lời trên là ý định - tại sao bạn thực hiện chuyển đổi, và (quan trọng hơn) những gì xảy ra trên đường sau khi chuyển đổi ?

Ví dụ, tôi đã nhìn thấy mã tương tự như một số sau lần:

if ((foo as SomeType).SomeMethod()) { /* ... */ }

Điều này có thể được so sánh với phiên bản đúc sử dụng:

if (((SomeType) foo).SomeMethod()) { /* ... */ }

Vì vậy, cái nào trong số này tốt hơn?

Dàn diễn viên là.

Sử dụng as sẽ dẫn đến NullReferenceException nếu chuyển đổi không thành công.

Sử dụng dàn diễn viên sẽ dẫn đến InvalidCastException nếu chuyển đổi không thành công.

Bây giờ, hãy cho tôi biết, đó là ngoại lệ hữu ích hơn để gỡ lỗi? A NullReferenceException, có thể được sản xuất bởi gần như bất kỳ thứ gì, hoặc InvalidCastException, cho bạn biết điều gì thực sự đã xảy ra?

Như vậy, chỉ sử dụng as nếu việc chuyển đổi là thực tùy chọn (có nghĩa là có phải được một tấm séc null trước khi sử dụng biến). Nếu không, sử dụng một diễn viên, do đó làm cho ý định của bạn rõ ràng hơn.

0

Tôi có thể nói rõ ràng ở đây, nhưng một điều mà bạn nhận được với dàn diễn viên là '', bạn được đảm bảo kết thúc với một đối tượng thuộc loại bạn yêu cầu. Điều này có ích trong các tình huống nhất định.

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