2013-09-03 38 views
5

Tôi khá mới đối với .Net và đang xem xét một mảng đối tượng cơ sở sẽ xử lý các kiểu khác nhau như thế nào. Tôi có xu hướng sử dụng kết hợp GetType(). ToString() trong một công tắc để tập trung xử lý sự kiện của tôi vào mã và tôi gặp phải các giá trị trả về sau. Tôi đã nhìn cho một câu trả lời ở đây và các nơi khác (bao gồm cả C# spec) nhưng không thể tìm thấy nơi này là trực tiếp giải quyết:GetType(). ToString() Trả về các ký tự không mong muốn

Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Objectify 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      object[] arrObjects = {"", 0, 0.0M, 'a', new Stack<string>(), new Queue<string>(), new Stack<int>(), new Queue<int>()}; 

      for (int i = 0; i < arrObjects.Length; i++) 
      { 
       Console.WriteLine(arrObjects[i].GetType().ToString()); 
      }   
     } 
    } 
} 

Output:

System.String 
System.Int32 
System.Decimal 
System.Char 
System.Collections.Generic.Stack`1[System.String] 
System.Collections.Generic.Queue`1[System.String] 
System.Collections.Generic.Stack`1[System.Int32] 
System.Collections.Generic.Queue`1[System.Int32] 

Các Phần "1" của các dòng 5 - 8 là bất ngờ từ quan điểm của tôi.

a) Ai đó có thể giải thích những gì đang diễn ra ở đây? b) Có cách nào để dự đoán khi nào các ký tự (hoặc khác) sẽ được đưa vào đầu ra không? Tôi có thể thấy rằng họ có mặt khi một Loại xây dựng được sử dụng, và không phải như vậy khi một loại nội tại được sử dụng.

BTW, đây là câu hỏi đầu tiên của tôi về lưu lượng truy cập. Tôi đã tìm thấy rất nhiều thông tin giá trị ở đây trong vài năm qua. Đây là lần đầu tiên tôi không thể tìm được câu trả lời.

+0

Cũng thử các công cụ như 'typeof (IComparable) .ToString()', 'typeof (IComparable <>). ToString()', 'typeof (IDictionary <,>) .ToString()', 'typeof (Func <,,,,>). ToString() ', v.v. Và với các kiểu lồng nhau bạn có một '+', ví dụ 'typeof (Environment.SpecialFolder) .ToString()', 'typeof (từ điển <,> .KeyCollection) .ToString()' –

Trả lời

5

Phương pháp Type.ToString sử dụng `1 làm điểm đánh dấu cho các loại chung loại (1 là tham chiếu "một" thông số chung). Đây:

System.Collections.Generic.Stack`1[System.String] 

là tên loại thực tế cho

System.Collections.Generic.Stack<System.String> 

trong C# cú pháp. Lưu ý rằng mỗi ngôn ngữ có thể có cú pháp riêng của nó. Ví dụ, loại này tương tự, trong VB, là:

System.Collections.Generic.Stack(Of System.String) 

Sự khác biệt chính là Type.ToString là một phần của CLR, và không gắn với một ngôn ngữ cụ thể (như C#), vì vậy cú pháp được sử dụng để hiển thị chung các loại khác nhau.

+0

Các thư viện bất khả tri. Tôi luôn luôn quên rằng ... – JWD

4

Chắc chắn - các loại này là chung chung. Phần `1 cho biết số của các thông số loại chung (luôn luôn là 1 trong trường hợp của bạn) và phần [System.String] hoặc [System.Int32] cho biết loại đối số được sử dụng cho thông số loại đó.

Vì vậy, ví dụ, nếu bạn tạo ra một Dictionary<int, string> bạn muốn nhận được:

System.Collections.Generic.Dictionary`2[System.Int32,System.String] 
1

`1 là một số thông số kiểu chung chung.

System.Collections.Generic.Queue`1[System.Int32] 

Có nghĩa là một Queue với 1 loại tham số đó là Int32

1

Đây là ký hiệu của CLR cho các kiểu generic.
`1 có nghĩa là loại có một tham số chung.

Điều này là cần thiết vì các loại chung có thể bị quá tải – có 8 loại có tên System.Action.

0

Đôi khi CLR sử dụng các ký tự đặc biệt/dành riêng đằng sau hậu trường, để đảm bảo bạn không thể tạo lớp/khai báo có cùng tên với lớp được tạo tự động.

Những gì bạn đang thấy đây là những gì một generic loại tạo thực sự vẻ như, đằng sau hậu trường

0

Ai đó có thể giải thích những gì đang xảy ra ở đây?

`1[System.String] có nghĩa là loại có một thông số loại, là System.String trong trường hợp này.

+0

Việc phân chia có thể thất bại trên các loại lồng nhau bên trong các loại chung chung. Ví dụ với 'var dict = new Dictionary (); var typeStr = dict.Keys.GetType(). ToString(); ', chuỗi sẽ là' 'System.Collections.Generic.Dictionary'2 + KeyCollection [System.String, System.Object]' 'và sau đó nó cũng vậy ngây thơ để Split trên backtick. –

+0

@ Jeppe: Tôi hiểu. Tôi đã gỡ bỏ phần chia tách trên backtick. – ProgramFOX

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