2012-05-30 44 views
8

Hôm nay tôi đã tạo một giá trị tham số mặc định trong một hàm tạo.Tại sao tôi không thể sử dụng String.Empty làm giá trị thông số mặc định?

public SomeClass (String something = String.Empty) 
{ 
    // ... 
} 

Trình biên dịch đã phàn nàn.

Giá trị thông số mặc định cho "cái gì đó" phải là thời gian biên dịch không đổi.

Tôi đã ấn tượng rằng Empty trên lớp String là hằng số biên dịch.

.field public static initonly string Empty 

Tôi có hiểu nhầm về ý nghĩa của hằng số biên dịch hay không, hay tôi chỉ cần chấp nhận nhiều hơn?

+0

Thông báo lỗi cho biết hiển thị của bạn là 'erm không chính xác. –

+1

Thảo luận đầy đủ hơn ở đây: http://stackoverflow.com/questions/507923/why-isnt-string-empty-a-constant –

Trả lời

4

Câu trả lời được chấp nhận cho this Câu hỏi SO Tại sao không phải là chuỗi.Empty một hằng số? là:

Lý do chỉ đọc tĩnh được sử dụng thay vì const là do sử dụng với mã không được quản lý, như được chỉ ra bởi Microsoft tại đây trong Bản phát hành cơ sở hạ tầng ngôn ngữ chung được chia sẻ nguồn 2.0. Tệp cần xem xét là sscli20 \ clr \ src \ bcl \ system \ string.cs.

Hằng số trống giữ giá trị chuỗi rỗng. Chúng ta cần gọi hàm dựng String để trình biên dịch không đánh dấu nó là chữ.

Đánh dấu phần này dưới dạng chữ nghĩa là nó không hiển thị dưới dạng trường mà chúng tôi có thể truy cập từ gốc.

Tôi tìm thấy thông tin này từ tiện ích này article tại CodeProject.

+0

Tôi nghĩ bạn có nghĩa vụ phải đánh dấu điều này là trùng lặp? không đưa ra câu trả lời. – Harrison

2

Trường static readonly không phải là hằng số biên dịch. Nó chỉ là một trường tĩnh, không nên thay đổi sau khi lớp được khởi tạo xong.

Trong triển khai .net hiện tại, bạn thậm chí có thể thay đổi nó bằng phản xạ, dẫn đến hành vi thực sự kỳ lạ.

Thay vào đó, bạn có thể sử dụng "", dưới dạng chuỗi ký tự là hằng số thời gian biên dịch.

1

Trường readonly là hằng số thời gian chạy. Nó sẽ không bị ràng buộc với một giá trị cho đến khi đối tượng (hoặc lớp, nếu trường là static) được khởi tạo.

Hằng số biên dịch theo thời gian là các chữ (chẳng hạn như "" - mà về cơ bản giống như String.Empty, dù sao) và bất kỳ thứ gì được đánh dấu const.

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