2010-02-26 34 views

Trả lời

27

Bạn có thể xem định nghĩa của một Guid mình:

public struct Guid ... 

Hoặc bạn có thể kiểm tra nó như thế này:

bool guidIsValueType = typeof(Guid).IsValueType; 

của GUID được tạo ra bằng cách sử dụng từ khóa mới mà làm cho tôi suy nghĩ đó là loại tham chiếu .

Các cấu trúc cũng có thể có các hàm tạo, ví dụ: new DateTime(2012, 12, 23).

+0

Không, đó là Loại Giá trị -> xem câu trả lời của @ Randolpho – CodingYourLife

30

Hướng dẫn là loại giá trị.

Xem MSDN. Lưu ý rằng Guid là struct. Tất cả các cấu trúc là Value Types.

+4

Ngoại trừ khóa học cho System.ValueType thực tế là một lớp :) – JaredPar

+1

@JaredPar: Đúng, nhưng nó cũng trừu tượng, vì vậy không có nguy cơ xảy ra sự kiện. – Randolpho

5

Thực tế là Guid. Tất cả các loại được xây dựng bằng cách sử dụng từ khóa new. Bạn có thể xác định loại tham chiếu từ các loại giá trị cho dù chúng là class, interface hoặc delegate (tất cả các loại tham chiếu) hoặc struct hoặc enum (loại giá trị).

+4

Bạn có thể muốn thêm enum vào danh sách các loại giá trị của mình. –

15

GUID được tạo bằng từ khóa mới khiến tôi nghĩ đây là loại tham chiếu.

Đừng nghĩ vậy. Các kiểu giá trị có thể có các hàm tạo. Hoàn toàn hợp pháp, mặc dù lạ, để nói

int x = new int(); 

Điều này tương tự như gán 0 cho x.

Điều này có đúng không?

Không.

GUID có được lưu trữ trên heap không?

Có. Các hướng dẫn cũng được lưu trữ trên ngăn xếp.

Lưu ý rằng phân tích bên dưới giả định rằng việc triển khai CLI là Microsoft "máy tính để bàn" hoặc "Silverlight" CLR chạy trên Windows. Tôi không biết các phiên bản CLI khác làm gì, những gì họ làm trên máy Mac, v.v.Nếu bạn cần biết liệu một bộ nhớ cụ thể có được lưu trữ trên ngăn xếp trong các triển khai khác hay không, bạn sẽ phải hỏi ai đó là một chuyên gia về các triển khai đó.

Một Guid được lưu trữ trên stack trong các trường hợp sau đây:

(1) khi Guid là "tạm thời" kết quả của một tính liên tục hoặc đang được sử dụng như một tham số để một phương pháp. Ví dụ, nếu bạn có một phương thức gọi M (new Guid()) thì lưu trữ tạm thời cho Guid mới được cấp phát trên stack.

(2) khi Guid là biến cục bộ (a) không nằm trong khối lặp, (b) không phải là biến ngoài đóng của một phương thức ẩn danh hoặc biểu thức lambda.

Trong tất cả các trường hợp khác, hướng dẫn không được lưu trữ trên ngăn xếp. Một Guid được lưu trữ trên heap khi nó là một trường của một kiểu tham chiếu, một phần tử của một mảng, một địa chỉ đóng của một phương thức nặc danh hoặc biểu thức lambda, hoặc một cục bộ trong một khối lặp.

Hướng dẫn cũng có thể được lưu trữ trong cả đống GC lẫn ngăn xếp. Một Guid có thể được lưu trữ trong bộ nhớ hoàn toàn không được quản lý, được truy cập thông qua số học con trỏ không an toàn.

Tôi tò mò về lý do tại sao bạn quan tâm nhiều đến việc các bit của một guid có nằm trên ngăn xếp hoặc trên vùng heap hay không. Điều gì khác biệt nó làm?

+0

tốt, bây giờ là nó rõ ràng guid có thể được lưu trữ bất cứ nơi nào, tôi đoán nó sẽ không quan trọng. – SoftwareGeek

+0

Khi viết các ứng dụng thời gian thực mềm (hoạt hình, trò chơi, một số công việc giao diện người dùng), thường cần phải giảm, phân bổ hoặc loại bỏ phân bổ GC trong vòng "vòng lặp" cụ thể hoặc lặp lại phần mềm. Làm như vậy làm giảm hoặc loại bỏ các bộ sưu tập GC trong vòng lặp đó, gây ra hoạt ảnh "cản trở" hiển thị cho người dùng. Vì vậy, việc biết một dòng mã "allocs" cụ thể có cần thiết để quyết định khi nào nên lưu trữ các đối tượng hoặc sử dụng đối tượng tổng hợp hay không. Ví dụ: mô phỏng vật lý thời gian thực trơn tru được viết hoàn toàn bằng C# không được phân bổ trong các pha va chạm hoặc tích hợp. –

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