Je cherche l'équivalent de C# default
mot-clé, par exemple
public T GetNext()
{
T temp = default(T);
...
Merci
Je cherche l'équivalent de C# default
mot-clé, par exemple
public T GetNext()
{
T temp = default(T);
...
Merci
J'ai trouvé ceci dans un blog : " A quoi ressemble ce code C# en F# ? (première partie : expressions et déclarations) "
C# a un opérateur appelé "default" qui renvoie la valeur de zéro initialisation d'un type donné :
default(int)
Son utilité est limitée ; le plus souvent, vous pouvez utiliser default(T) dans un générique. F# possède une construction similaire en tant que bibliothèque de bibliothèque :
Unchecked.defaultof<int>
Techniquement parlant, la fonction F# Unchecked.defaultof<'a>
est un équivalent de la default
en C#. Cependant, je pense qu'il est utile de noter que defaultof
est considéré comme un non sécurisé en F# et ne devrait être utilisé que lorsqu'il est vraiment nécessaire (tout comme l'utilisation de null
(ce qui est également déconseillé en F#).
Dans la plupart des cas, vous pouvez éviter la nécessité de defaultof
en utilisant le option<'a>
type. Il vous permet de représenter le fait qu'une valeur n'est pas encore disponible.
Toutefois, voici un bref exemple pour démontrer l'idée. Le code C# suivant :
T temp = default(T);
// Code that may call: temp = foo()
if (temp == default(T)) temp = bar(arg)
return temp;
Il serait probablement écrit comme ceci en F# (en utilisant les fonctions 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 que vous pouvez faire. Cependant, je voulais juste souligner que defaultof
est utilisé moins fréquemment en F#.
Dans votre exemple C#, vous utilisez un opérateur d'affectation au lieu d'un opérateur d'égalité dans l'instruction if. Est-ce délibéré ?
Je dois dire que cela ne fonctionne pas pour moi, let t = ref None t := Some(context.Items.FirstOrDefault(fun ii -> ii.Name = i.Name)) match !t with | Some it -> - terminé ici même si it est null | None -> ignorer
@MartinBodocky votre code retournera toujours Some(_)
. Il renvoie soit Some(value)
ou Some(defaultof<>)
les deux correspondront à la Some _
dans votre expression de correspondance. Vous pourriez utiliser context.Items |> Seq.tryFind(fun II -> ii.Name = i.Name)
alors l'expression de correspondance fonctionnerait comme vous le souhaitez
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.