2017-06-16 20 views
5

Nếu tôi đã tạo biến không thuộc loại tham chiếu, hãy nói int, không thể, nghĩa là int?, điều này có nghĩa là tôi cần sử dụng hàm tạo trước khi gán giá trị không?Yêu cầu mới() cho biến loại không tham chiếu có thể vô hiệu hóa?

Thông thường để intialise một biến kiểu phi tham khảo tôi chỉ đơn giản làm

int foo = 5; 

Nhưng nếu tôi có một kiểu dữ liệu không tham khảo nullable biến là khởi động cần thiết, như dưới đây, hoặc tôi vẫn có thể sử dụng khởi động đơn giản ở trên?

int? foo = new int(); 
foo = 5; 
+0

Có bạn vẫn có thể sử dụng khởi tạo đơn giản. :) –

+5

Bạn có thể vừa thử 'int? foo = 5' và xem nó hoạt động như thế nào, nhanh hơn nhiều so với nhập câu hỏi này. – Evk

+0

@Evk Tôi có thể, nhưng tôi sẽ không hiểu chuyện gì đang xảy ra và nếu nó có thể thay đổi trong hoàn cảnh khác - tôi muốn hỏi và hiểu thay vì giả sử :) – Toby

Trả lời

8

Không. Bạn không cần phải tạo cá thể trước khi chuyển nhượng. int? là một cấu trúc được tạo ra khi gán.

phân công của bạn foo = 5; thực sự là:

foo = new Nullable<int>(5); 

này đều được làm bằng các trình biên dịch. Không cần phải làm điều này một mình.

+2

@adjan, câu hỏi có thể là người nghèo (về mặt chủ quan) nhưng nó không phải là dựa trên ý kiến ​​tất cả, một số mã hoặc là công trình hoặc nó không.Hơn nữa, bỏ phiếu xuống một câu trả lời vì ý kiến ​​của bạn về câu hỏi là không chính xác – Toby

+3

@adjan, câu hỏi là hoàn toàn hoàn toàn và vì vậy câu trả lời. Tôi thấy câu trả lời của bạn bị xóa mà bản thân nó là người nghèo trong tự nhiên và vì vậy có lẽ đã downvoted – Rahul

+2

@Toby tôi chỉnh sửa câu trả lời của bạn vì vậy tôi có thể loại bỏ các downvote. – Adrian

2

int? là đường cú pháp cho Nullable<int>; như đối với Nullable<T> nếu chúng ta có nhìn vào thực hiện

https://referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e

chúng ta sẽ tìm thấy một điều hành ngầm khai:

public struct Nullable<T> where T : struct 
{ 
    ... 

    [System.Runtime.Versioning.NonVersionable] 
    public static implicit operator Nullable<T>(T value) { 
     return new Nullable<T>(value); 
    } 

    ... 
} 

Vì vậy, đối với bất kỳ structT thay vì rõ ràng constructor gọi

T value = ... 

T? test = new Nullable<T>(value); 

chúng ta có thể sử dụng ngầm hành

T? test = value; // implicit operation in action 

Trong trường hợp cụ thể của bạn Tint và chúng tôi có

int? foo = 5; 
+1

Những gì bạn nói âm thanh hợp lý, ngoại trừ nó không thực sự đúng. Khi bạn viết 'int? foo = 5; ', trình biên dịch không sử dụng toán tử chuyển đổi ngầm. Thay vào đó, nó gọi trực tiếp hàm tạo 'Nullable '. – svick

+0

@svick: toán tử ngầm ẩn chỉ gọi hàm tạo; Trình biên dịch C# (trình tối ưu hóa?) Chỉ loại bỏ cuộc gọi trung gian. –

+1

Tôi tin rằng trình biên dịch C# không bao giờ thực hiện loại tối ưu hóa nội tuyến đó, do đó không nên là nó. – svick

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