2010-03-08 56 views
17

Trong C# ai có thể xác định một hằng số loại thành viên như thế này:Cách xác định hằng số thành viên loại trong F #?

class Foo { public const int Bar = 600; } 

Các IL trông như thế này.

.field public static literal int32 Bar = int32(600) 

Làm cách nào tôi có thể thực hiện tương tự trong Visual F #/FSharp?

Tôi cố gắng này không có kết quả:

[<Sealed>] 
type Foo() = 

    [<Literal>] 
    let Bar = 600 
+0

Tôi đã đặt câu hỏi này - http://stackoverflow.com/questions/1834923/f-public-literal - và Chris Smith cho biết điều đó là không thể. – Daniel

Trả lời

0

Tôi không chắc rằng điều này là có thể. Trong thực tế, tôi thậm chí không nghĩ rằng bạn có thể tạo ra các lĩnh vực công bất biến, chưa kể đến hằng số.

+0

Tôi tin rằng bạn có thể tạo ra các trường không thay đổi công khai bằng cách sử dụng khai báo 'val' và khởi tạo rõ ràng trong hàm tạo bằng cách sử dụng' new() ', nhưng điều đó sẽ không hoạt động cho các hằng số, vì các trường' val' được khởi tạo trong hàm tạo. –

+0

@Tomas - Tôi nghĩ rằng bạn sẽ thấy rằng đề xuất của bạn thực sự dẫn đến một thuộc tính đang được xác định, chứ không phải là một trường. Tuy nhiên, việc sử dụng 'val mutable' sẽ dẫn đến trường có thể thay đổi. – kvb

+0

Bạn nói đúng. công khai 'val' kết quả trong một tài sản với một lĩnh vực tư nhân (động lực là để cấm người dùng C# có thể của lớp từ sửa đổi một lĩnh vực mà nên được bất biến). –

18

Tôi đã thực hiện một vài thí nghiệm với trình biên dịch F # và đây là một số quan sát của tôi. Nếu bạn muốn tạo chữ IL, thì bạn cần đặt giá trị được đánh dấu là Literal bên trong một mô-đun. Ví dụ như thế này:

module Constants = 
    [<Literal>] 
    let Num = 1 

Là một phụ lưu ý, tôi đã làm một tìm kiếm nhanh thông qua F # đặc điểm kỹ thuật và có vẻ như rằng literals có thể rất hữu ích cho phù hợp với mô hình, bởi vì bạn có thể sử dụng chúng như là một mô hình (như miễn là họ bắt đầu với một ký tự hoa):

open Constants 
match 1 with 
| Num -> "1" 
| _ -> "other" 

Bây giờ, câu hỏi là, tại sao Literal không cư xử như bạn mong chờ khi bạn đặt nó bên trong một tuyên bố loại. Tôi nghĩ lý do là tuyên bố let bên trong khai báo loại F # không thể công khai và sẽ chỉ hiển thị bên trong lớp/loại. Tôi tin rằng cả hai giá trị C# và F # inline literal khi bạn sử dụng chúng và điều này cũng được thực hiện bên trong các khai báo kiểu. Tuy nhiên, vì chữ không thể công khai, không có lý do gì để tạo ra trường literal IL, bởi vì không ai có thể truy cập nó.

+0

Trong C#, các chữ cái sẽ được inlined bytecode, nhưng trường const sẽ vẫn ở đó để sử dụng cho các loại khác. – zproxy

+0

Có - trong F # trường 'sẽ được tạo nếu chữ là công khai (ví dụ: trong một mô-đun) và có thể được sử dụng bởi ai đó; nếu nó chỉ hiển thị bên trong lớp, thì không có điểm nào tạo ra bytecode, bởi vì các kiểu khác không thể sử dụng nó. –

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