2010-03-08 19 views
17

böyle bir tipi eleman sabit tanımlayabiliriz:F # tür üye sabiti nasıl tanımlanır? C# birinde

class Foo { public const int Bar = 600; } 

IL Bu gibi görünüyor.

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

Aynısını Visual F #/FSharp içinde nasıl yapabilirim?

Ben boşuna bu çalıştı:

[<Sealed>] 
type Foo() = 

    [<Literal>] 
    let Bar = 600 
+0

Bu soruyu - http://stackoverflow.com/questions/1834923/f-public-literal - sordum ve Chris Smith bunun mümkün olmadığını belirtti. – Daniel

cevap

0

Ben bu mümkün olduğundan emin değilim. Aslında, sabitleri belirtmek için değişmez kamusal alanlar yaratabileceğinizi bile düşünmüyorum.

+0

Sana 'kullanılarak yazılmıştır yapıcısındaki' val' beyanı ve açık başlatma kullanarak kamu değişmez alanları oluşturabilir inanıyoruz yeni() 'fakat val' alanları yapıcı başlatılır' çünkü, sabitleri için işe yaramaz. –

+0

@Tomas - Bence önerinizin aslında bir alan yerine tanımlanmış bir özellik ile sonuçlandığını göreceksiniz. Bununla birlikte, bir "val döllenebilir" kullanılması, değiştirilebilen bir alana neden olur. – kvb

+0

Haklısınız. public 'val', özel bir alana sahip bir mülkle sonuçlanır (motivasyon, sınıfın olası C# kullanıcılarını, değişmez olması gereken bir alanın değiştirilmesini yasaklamaktır). C# –

18

F # derleyicisiyle birkaç denemeler yaptım ve burada bazı gözlemlerim var. IL literal oluşturmak istiyorsanız, bir modül içinde Literal olarak işaretlenmiş değeri yerleştirmeniz gerekir. Böyle Örneğin: Bir yan not olarak

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

, (I F # şartname yoluyla hızlı bir arama yaptım ve bir desen olarak kullanabilirsiniz, çünkü sabitler, desen eşleşmesi için çok yararlı olabilir gibi görünüyor onlar) büyük harfle başlar sürece:

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

Şimdi Literal bir tip bildirimi içine yerleştirdiğinizde beklendiği gibi davranmaz neden sorudur. Ben neden bir F # tipi beyanı içine let beyan kamu olamaz ve tek sınıf/tip içinde görünür olur olduğunu düşünüyorum. Bunları kullandığınızda hem C# hem de F # satır içi değişmez değerlerine inanıyorum ve bu da tür bildirimleri içinde yapılır. değişmezi kamu olamaz Ancak bu yana daha hiç kimse erişebilir, çünkü literal IL alanın oluşturulması için hiçbir neden yoktur.

+0

değişmezleri byte satır içine yerleştirilmiş, ancak diğer türleri kullanılacak için const alanı yine orada olacak. – zproxy

+0

Evet - literal genel ise (örneğin bir modülde) F # the 'alanı 'oluşturulur ve birisi tarafından kullanılabilir; eğer sadece sınıf içinde görünürse, bytecode üreten bir nokta yoktur, çünkü diğer türler yine de onu kullanamazlar. –