The relevant part of the specification is section 8.6.2 . It states:
The compiled view used for values ββdeclared in "let" bindings in classes:
A value that is local to the constructor of the object (if the value is not a syntax function, it is not mutable and is not used in any function or member).
An instance field in the corresponding CLI type (if the value is not a syntax function, but is used in some function or member).
A member of the corresponding CLI type (if the value is a syntax function).
also:
Non-functional let-bindings that are not used in any element type or function binding are optimized and become values ββthat are local to the created CLI constructor. Similarly, the binding function is represented as instance members.
I prefer let
bindings to private members because they are more "functional", that is, they emphasize "what" over "how." The compiler will take care of the optimal compiled form.
source share