2010-08-16 9 views
2

Dans le cas suivant:F #: Quelle est la différence entre le module let et le type static let?

module MyModule = 
    let myObj = new MyObj() 

type MyType() = 
    static let myObj_ = new MyObj() 
    static member myObj = myObj_ 

... sont MyModule.myObj et MyType.myObj fonctionnellement (sans jeu de mots) équivalent?

Chaque fois que j'appelle MyModule.myObj ou MyType.myObj, je ne veux pas que le code crée réellement un nouvel objet. Je veux juste accéder aux méthodes sur un objet singleton. J'espère que l'un ou l'autre des éléments ci-dessus conviennent à cette fin.

+0

Pouvez-vous 'ouvrir 'votre' MyType'? –

Répondre

4

L'essayer et voir? Je pense que ce sont les mêmes, mais je pense que vous pouvez créer un type MyObj avec un constructeur qui imprime quelque chose, puis vérifier facilement le comportement avec un programme de test court. (Ou peut-être vous posez des questions sur autre chose dont je ne suis pas sûr.)

+0

Bonne idée, Brian. Je l'ai essayé, inséré un appel à System.Windows.MessageBox.Show (string) dans le constructeur(). La boîte de message n'apparaissait pas lorsque j'ai affecté MyModule.myObj ou MyType.myObj à une valeur; il est apparu seulement quand les singletons ont été initialisés, donc il semble en effet que les deux méthodes sont équivalentes. Merci pour la suggestion! – MiloDC

1

Dans les deux cas, l'objet n'est définitivement créé qu'une seule fois.

Il existe cependant une petite différence (théorique). Avec le let statique, l'objet est seulement garanti d'être créé avant que MyType soit utilisé la première fois (MSDN).

Une reliure de niveau de module est probablement exécutée au démarrage du programme (ou peut-être lors de la première utilisation d'un module?).

+0

Intéressant. Bonne information, merci wmeyer! – MiloDC

Questions connexes