2009-08-27 12 views
11

Loại truyền là gì, việc sử dụng cái này là gì? Làm thế nào nó hoạt động?Định hình trong C#

Vui lòng cung cấp hướng dẫn mẫu, tôi không thể tìm thấy bất kỳ tài liệu hay nào tìm kiếm trên Google.

+2

ha ha ha .. thật là một trò đùa! – MAC

+0

Tôi có thể cho bạn biết làm thế nào để xây dựng câu hỏi của bạn đúng, homie! –

+0

[http://en.wikipedia.org/wiki/Type_conversion](http://en.wikipedia.org/wiki/Type_conversion) – Raghav

Trả lời

50

Đúc thường là một vấn đề cứ phải nói về trình biên dịch rằng mặc dù nó chỉ biết rằng một giá trị của một số loại hình chung, bạn biết đó là thực của một loại cụ thể hơn. Ví dụ:

object x = "hello"; 

... 

// I know that x really refers to a string 
string y = (string) x; 

Có nhiều toán tử chuyển đổi khác nhau. Hình thức (typename) expression có thể làm ba việc khác nhau:

  • Một chuyển đổi unboxing (ví dụ như từ một số nguyên đóng hộp để int)
  • Chuyển đổi người dùng định nghĩa (ví dụ như đúc XAttribute để string)
  • Chuyển đổi tài liệu tham khảo trong vòng một loại hệ thống phân cấp (ví dụ: đúc object đến string)

Tất cả những điều này có thể thất bại trong thời gian thực thi, trong trường hợp ngoại lệ sẽ được ném .

Nhà điều hành as, mặt khác, không bao giờ ném một ngoại lệ - thay vào đó, kết quả của việc chuyển đổi là null nếu nó không thành công:

object x = new object(); 
string y = x as string; // Now y is null because x isn't a string 

Nó có thể được sử dụng cho unboxing đến một loại giá trị nullable:

object x = 10; // Boxed int 
float? y = x as float?; // Now y has a null value because x isn't a boxed float 

Cũng có chuyển đổi tiềm ẩn, ví dụ: từ int để long:

int x = 10; 
long y = x; // Implicit conversion 

Liệu rằng bao gồm tất cả mọi thứ bạn đã quan tâm?

+1

Câu trả lời hay đấy Jon! – UnkwnTech

+2

@jon Skeet đưa ra câu trả lời và nó không bao gồm mọi thứ nó đã từng xảy ra? – Shrivallabh

+0

Đọc [this] (http://stackoverflow.com/questions/2690866/what-is-the-purpose-of-a-question-mark-after-a-type-for-example-int-myvariabl) để xem những gì dấu chấm hỏi sau khi loại 'float'. – martijnn2008

2

Xem this hoặc this:

Bởi vì C# được tĩnh đánh máy tại thời gian biên dịch, sau khi một biến được khai báo, nó có thể không được công bố lại hoặc sử dụng để lưu trữ các giá trị của các loại khác trừ loại đó là chuyển đổi thành loại của biến số

...

Tuy nhiên, đôi khi bạn có thể cần phải sao chép giá trị vào biến hoặc phương pháp tham số của loại khác. Ví dụ, bạn có thể có một biến số nguyên mà bạn cần phải chuyển đến một phương thức có tham số được gõ là double. Hoặc bạn có thể cần gán một biến lớp cho một biến kiểu giao diện. Các loại hoạt động này được gọi là chuyển đổi loại. Trong C#, bạn có thể thực hiện các loại chuyển đổi sau đây

+0

Từ liên kết: "Tuy nhiên, nếu không thể thực hiện chuyển đổi mà không có nguy cơ mất thông tin, trình biên dịch yêu cầu bạn thực hiện chuyển đổi rõ ràng, được gọi là diễn viên. " Có phải việc truyền đúc giống với chuyển đổi rõ ràng không? –

0

Truyền từ một kiểu dữ liệu này sang loại dữ liệu khác.

Để đọc chung, hãy xem this.

Xem thêm msdn

3

Đúc nghĩa là tạo tham chiếu đến một đối tượng thuộc loại khác với tham chiếu bạn hiện đang nắm giữ. Bạn có thể làm upcasting hoặc downcasting và từng có lợi ích khác nhau.

Upcasting:

string greeting = "Hi Bob"; 
object o = greeting; 

này tạo ra một tài liệu tham khảo tổng quát hơn (object) từ các tài liệu tham khảo cụ thể hơn (string). Có thể bạn đã viết mã có thể xử lý bất kỳ đối tượng nào, như sau:

Console.WriteLine("Type of o is " + o.GetType()); 

Mã đó không cần phải thay đổi bất kể bạn đang đặt đối tượng nào.

downcasting:

object o = "Hi Bob"; 
string greeting = (string)o; 

Ở đây bạn muốn có một tài liệu tham khảo cụ thể hơn. Bạn có thể biết rằng đối tượng là một chuỗi (bạn có thể kiểm tra ví dụ này:.

if (o is string) 
{ do something } 

Bây giờ bạn có thể đối xử với các tài liệu tham khảo như là một chuỗi thay vì một đối tượng Ví dụ: một chuỗi có chiều dài (nhưng một đối tượng không), vì vậy bạn có thể nói:.

Console.WriteLine("Length of string is " + greeting.length); 

Mà bạn không thể làm với một đối tượng

0

Ngoài ra, nếu bạn đang đúc một cách rõ ràng, bạn có thể tận dụng lợi thế của mô hình kết hợp Nếu bạn có một đối tượng. :

object aObject = "My string value"; 

Bạn một cách an toàn có thể cast đối tượng như là một chuỗi trong một dòng duy nhất:

if (aObject is string aString) 
{ 
    Console.WriteLine("aString = " + aString) 
    // Output: "aString = My string value" 
} 

Sử dụng này, cùng với một đảo ngược lệnh if, bạn có thể đúc một cách an toàn các loại, và thất bại sớm nếu cần thiết:

public void Conversion(object objA, object objB) 
{ 
    // Fail out early if the objects provided are not the correct type, or are null 
    if (!(objA is string str) || !(objB is int num)) { return; } 

    // Now, you have `str` and `num` that are safely cast, non-null variables 
    // all while maintaining the same scope as your Conversion method 
    Console.WriteLine("str.Length is " + str.Length); 
    Console.WriteLine("num is " + num); 
}