Принуждение поля типа F # к нулю - PullRequest
4 голосов
/ 03 января 2012

Я хорошо понимаю преимущество option, но в этом случае я хочу избегать использования option по соображениям производительности. option переносит тип в класс, что просто означает больше работы для сборщика мусора - и я хочу избежать этого.

В этом случае, особенно, у меня есть несколько полей, которые все Some при одинаковых обстоятельствах, но я не хочу помещать их в кортеж, потому что, опять-таки, кортежи являются классами - и создают дополнительную нагрузку на GC. Таким образом, я получаю доступ к field.Value - что побеждает цель option.

Поэтому, если не существует оптимизации, о которой я не знаю, из-за которой типы option будут рассматриваться как потенциально нулевые ссылки, я просто хочу использовать null. Есть ли способ, которым я могу это сделать?

Редактировать: Чтобы расширить то, что я делаю, я создаю иерархию ограничивающих томов , которая на самом деле представляет собой двоичное дерево с данными только в конечных узлах. Я реализую его как класс, а не как дискриминируемый союз, потому что сохранение неизменяемости элементов не является вариантом по соображениям производительности, и дискриминируемые профсоюзы не могут иметь mutable членов, только ref s - снова, добавляя к давлению ГХ.

Как бы глупо это ни было в функциональном языке, я могу просто сделать каждый тип узла наследованием родительского типа Node. Даункастинг не совсем быстрая операция, но с точки зрения XNA и WP7 почти все лучше, чем злить GC.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Согласно этой документации MSDN , если вы украсите свой тип атрибутом [<AllowNullLiteral>], вы можете затем вызвать Unchecked.defaultof<T>(), чтобы создать для вас нулевое значение.

Похоже,быть единственным способом в F # делать то, что вы хотите.В противном случае вы могли бы выполнить маршалинг на другой язык .net и получить оттуда нулевые значения ... но я предполагаю, что это совсем не то, что вам нужно

1 голос
/ 14 июня 2019

Теперь есть Параметры значения , которые могут дать вам лучшее из обоих миров

[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
    | ValueNone
    | ValueSome of 'T

Нет переноса классов и семантики синтаксиса Option<'T>

...