Esta pregunta no se trata de compatibilidad con C#/F# como en esta .
Me gustaría saber la forma correcta de implementar un tipo como F# Unit en lugar de usar void
.
Obviamente descartaré este resultado y no expondré este tipo al mundo exterior.
Me pregunto si una clase vacía podría hacerse pasar por este rol.
internal class Unit { }
Por ejemplo, en la biblioteca language-ext , el autor usó una struct
.
¿Hay algún beneficio en esta elección?
No estoy seguro de cuál es la mejor manera de definir la Unit
para su uso desde C#. Puede diferir de cómo se hace esto en F# (porque en F#, el compilador oculta el uso de alguna manera).
Sin embargo, puede encontrar la implementación de la unit
F# en la biblioteca central:
Estos son los puntos clave sobre la implementación de la unit
F#
GetHashCode
y Equals
de la misma forma que la versión RxIComparable
y todos los valores del tipo de unit
son igualesunit
. Tampoco tiene una instancia predeterminada (a diferencia de la unidad Rx) y, por lo tanto, en F#, todos los valores de la unidad se representan en realidad como null
. Sin embargo, el lenguaje/compilador generalmente oculta este hecho. Entonces, parece que la única diferencia en F# es que usa el valor null
. Si desea usar la unit
explícitamente, esta podría no ser la mejor opción. Sin embargo, si tiene Unit.Default
, finalmente está definiendo un tipo con dos valores posibles, porque puede ser Unit.Default
o null
(¡y por lo tanto no es realmente una unidad!)
System.ValueTuple
(sin argumento genérico) es una gran unidad en C#. El código fuente está abierto.
He usado este tipo de Unidad como referencia: https://github.com/louthy/language-ext/blob/main/LanguageExt.Core/DataTypes/Unit/Unit.cs
Viniendo de una biblioteca de extensión funcional.