Що еквівалентно F # ключового слова C # за замовчуванням?


Відповіді:


88

Я знайшов це в блозі: " Як виглядає цей код C # у F #? (Частина перша: вирази та твердження) "

C # має оператор "default", який повертає значення нульової ініціалізації даного типу:

default(int) 

Він має обмежену корисність; найчастіше ви можете використовувати за замовчуванням (T) у загальному вигляді. F # має подібну конструкцію як бібліотечна функція:

Unchecked.defaultof<int>

34

Технічно кажучи, функція F # Unchecked.defaultof<'a>еквівалентна defaultоператору в C #. Однак, я думаю, варто зазначити, що в F # defaultofрозглядається як небезпечна річ, і її слід використовувати лише тоді, коли це дійсно необхідно (так само, як використання null, що також не рекомендується в F #).

У більшості ситуацій ви можете уникнути потреби defaultof, використовуючи option<'a>тип. Це дозволяє представити той факт, що значення ще не доступне.

Однак ось короткий приклад для демонстрації ідеї. Наступний код C #:

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

Можливо, це буде написано так у F # (з використанням імперативних функцій):

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

Звичайно, це залежить від вашого конкретного сценарію, і в деяких випадках defaultofце єдине, що ви можете зробити. Однак я просто хотів зазначити, що defaultofу F # використовується рідше.


1
У вашому прикладі C # ви використовуєте оператор присвоєння замість оператора рівності всередині оператора if. Це навмисно?
doppelgreener

Слід сказати, що це не працює для мене, нехай t = ref Немає t: = Деякі (context.Items.FirstOrDefault (задоволення ii -> ii.Name = i.Name)) збігаються! T з | Деякі з них -> - закінчені тут, навіть це null | None -> ignore
Martin Bodocky

@MartinBodocky ваш код завжди буде повертатися Some(_). Він або повертається, Some(value)або Some(defaultof<>)обидва відповідатимуть Some _регістру у вашому виразі відповідності. ви могли б використати context.Items |> Seq.tryFind(fun II -> ii.Name = i.Name)тоді вираз збігу буде працювати так, як ви очікуєте
Rune FS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.