There is an argument that non-print types should always declare a protected constructor without parameters (where your others have parameters).
This allows flexibility for subclasses to instantiate the class in their own way, rather than forcing parameters to be provided to the base constructor.
Mocking frameworks is just an example of a subclass that wants freedom to be able to instantiate the class in its own way; the mock object does not care about setting default values or dependencies, since it will still mock return values.
One day, your own classes or library clients may have completely different ideas for setting up the class, and you don’t want the type that you can’t develop for several months to depend on what you are forced to push what is no longer you need to be in the ctor database.
There are rare cases when you absolutely must force to initialize the initialization value, but this is rare - note that structures should not have ctors without parameters.
source share