When all the chainable functions of the object in stake are - in essence - just setters for individual parameters (like in your example), then the semantic differencedifferences between the two aproaches isapproaches are almost negliblenegligible. If that's the case, using optional parameters is more simplersimple, more idiomatic, and therefore preferrable.
However, function chaining (or method chaining) makes more sense forin the context of builder
objects where the methods have more complex semantics. For example, think about a ControlBuilder
with a fluent interfacefluent interface, where you can add label text subsequently by calling a method like AppendLine
more than once. Or, think about methods where the specific order of calls makes a difference. There are plenty of examples for this in the Wikipedia article about Fluent interfacefluent interfaces. That is something you cannot achieve with optional parameters.