2010-02-11 14 views

Répondre

68

Je trouve cela dans un blog: "What does this C# code look like in F#? (part one: expressions and statements)"

C# a un opérateur appelé " par défaut " qui renvoie la valeur d'initialisation zéro d'un type donné:

default(int) 

Il a une utilité limitée; le plus souvent, vous pouvez utiliser par défaut (T) dans un générique. F # a une construction similaire comme une bibliothèque fonction:

Unchecked.defaultof<int> 
31

Techniquement parlant F # Unchecked.defaultof<'a> fonction est un équivalent à l'opérateur default en C#. Cependant, je pense qu'il est à noter que defaultof est considéré comme dangereuse chose dans F # et ne devrait être utilisé que lorsque c'est vraiment nécessaire (tout comme en utilisant null, qui est également déconseillé en F #). Dans la plupart des cas, vous pouvez éviter le besoin de defaultof en utilisant le type option<'a>. Cela vous permet de représenter le fait qu'une valeur n'est pas encore disponible.

Cependant, voici un bref exemple pour démontrer l'idée. Le code C#:

T temp = default(T); 
// Code that may call: temp = foo() 
if (temp == default(T)) temp = bar(arg) 
return temp; 

serait probablement écrit comme ça dans F # (en utilisant les caractéristiques impératives):

let temp = ref None 
// Code that may call: temp := Some(foo()) 
match !temp with 
| None -> bar(arg) 
| Some(temp) -> temp 

Bien sûr, cela dépend de votre scénario spécifique et dans certains cas defaultof est la seule chose tu peux faire. Cependant, je voulais juste souligner que defaultof est utilisé moins fréquemment dans F #.

+1

Dans votre exemple C#, vous utilisez un opérateur d'affectation à la place d'un opérateur d'égalité dans l'instruction if. Est-ce délibéré? – doppelgreener

+0

Je devrais dire que cela ne fonctionne pas pour moi, let t = ref Aucun t: = Some (context.Items.FirstOrDefault (amusant ii -> ii.Name = i.Name)) match! T avec | Certains il -> - fini ici même c'est nul | Aucun -> ignore –