Ich suche nach dem Äquivalent des default
Schlüsselworts C # , z.
public T GetNext()
{
T temp = default(T);
...
Vielen Dank
Antworten:
Ich fand dies in einem Blog: " Wie sieht dieser C # -Code in F # aus? (Teil eins: Ausdrücke und Anweisungen) "
C # hat einen Operator namens "default", der den Nullinitialisierungswert eines bestimmten Typs zurückgibt:
default(int)
Es hat einen begrenzten Nutzen; Am häufigsten können Sie Standard (T) in einem Generikum verwenden. F # hat ein ähnliches Konstrukt wie eine Bibliotheksfunktion:
Unchecked.defaultof<int>
Technisch gesehen entspricht die F # -Funktion Unchecked.defaultof<'a>
dem default
Operator in C #. Ich denke jedoch, dass es erwähnenswert ist, dass dies in F # defaultof
als unsicher angesehen wird und nur verwendet werden sollte, wenn es wirklich notwendig ist (genau wie die Verwendung null
, von der auch in F # abgeraten wird).
In den meisten Situationen können Sie die Notwendigkeit vermeiden, defaultof
indem Sie den option<'a>
Typ verwenden. Damit können Sie die Tatsache darstellen, dass ein Wert noch nicht verfügbar ist.
Hier ist jedoch ein kurzes Beispiel, um die Idee zu demonstrieren. Der folgende C # -Code:
T temp = default(T);
// Code that may call: temp = foo()
if (temp == default(T)) temp = bar(arg)
return temp;
Würde wahrscheinlich so in F # geschrieben sein (unter Verwendung zwingender Merkmale):
let temp = ref None
// Code that may call: temp := Some(foo())
match !temp with
| None -> bar(arg)
| Some(temp) -> temp
Dies hängt natürlich von Ihrem spezifischen Szenario ab und ist in einigen Fällen defaultof
das einzige, was Sie tun können. Ich wollte jedoch nur darauf hinweisen, dass dies defaultof
in F # weniger häufig verwendet wird.
Some(_)
. Entweder wird zurückgegeben, Some(value)
oder Some(defaultof<>)
beide stimmen mit dem Some _
Fall in Ihrem Übereinstimmungsausdruck überein. Sie könnten context.Items |> Seq.tryFind(fun II -> ii.Name = i.Name)
dann verwenden, der Match-Ausdruck würde wie erwartet funktionieren