2016-05-28 16 views
5

Khi chúng ta tạo biến kiểu liệt kê và gán cho nó một giá trị liệt kêkiểu liệt kê trong C#

enum Members{HighlyQualified, Qualified, Ordinary} 
class 
{ 
static void Main() 
{ 
Members developers = Members.HighlyQualified; 
Console.WriteLine(developers);//write out HighlyQualified 
} 
} 

Kể từ enum là kiểu giá trị nên giá trị của các nhà phát triển được lưu trữ trên ngăn xếp được trả về bởi Members.HighlyQualified.Here chúng tôi hiểu rõ rằng giá trị của nhà phát triển là chuỗi tham chiếu đến vị trí bộ nhớ của các ký tự.

Bây giờ,

1.If chúng tôi đúc Members.HighlyQualifed đến một int thì giá trị trả về là 0. Làm thế nào nó xảy ra?

2.Giá trị thực sự được lưu trữ trên ngăn xếp cho loại điều tra?

+1

Bạn đã đọc [tài liệu] chưa (https://msdn.microsoft.com/en-) gb/library/cc138362.aspx)? Tất cả được giải thích trong đó –

+1

Bạn nên xem xét giá trị Enum dưới dạng số có tên. –

Trả lời

10

Ở đây chúng tôi thấy rõ rằng giá trị của nhà phát triển là chuỗi tham chiếu đến vị trí bộ nhớ của các ký tự.

Không, không phải. Giá trị của developers là loại Members. Nó được chuyển thành một chuỗi theo phương pháp Console.WriteLine. Bạn sẽ được gọi là quá tải Console.WriteLine(object), trong đó hộp giá trị - và sau đó Console.WriteLine sẽ gọi ToString trên giá trị được đóng hộp đó, cung cấp tên giá trị enum thích hợp.

Nếu chúng tôi truyền thành viên.HighlyQualifed to int thì giá trị trả về là 0. Làm thế nào điều đó xảy ra?

HighlyQualified là thành viên đầu tiên được khai báo trong Members và bạn chưa chỉ định bất kỳ giá trị cụ thể nào. Theo mặc định, trình biên dịch C# gán giá trị 0 cho giá trị được khai báo đầu tiên, sau đó tăng thêm 1 lần mỗi lần. Nếu bạn truyền Members.Qualified đến int, bạn sẽ nhận được 1.

Giá trị nào thực sự được lưu trữ trên ngăn xếp cho loại điều tra?

Giá trị, là hiệu quả chỉ là một số. (Trong trường hợp này, int vì đó là loại cơ bản mặc định. Tuy nhiên, ngăn xếp có loại phù hợp - loại enum.

3

The documentation giải thích các loại cơ bản:

Theo mặc định các loại cơ bản của mỗi phần tử trong enum là int.

và làm thế nào các giá trị được tạo ra khi không được xác định một cách rõ ràng:

Khi bạn không chỉ định giá trị cho các phần tử trong danh sách điều tra viên, các giá trị được tự động tăng thêm 1.

Vì vậy, trong trường hợp của bạn, tờ khai tương đương với:

enum Members : int 
{ 
    HighlyQualified = 0, 
    Qualified = 1, 
    Ordinary = 2 
} 

Điều gì là gì? 'S trên stack là enum kiểu riêng của mình (Members trong trường hợp này), và khi bạn gọi Console.WriteLine nó sẽ gọi ToString trên đó, mà, per the docs for that, trả về:

một chuỗi chứa tên của hằng số

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