Repository navigation
Advanced Usage
The core of this library is a single struct with unit extension methods and standard operators, so there isn't a huge surface of advanced features — but a few things are worth knowing.
Because every Distance is stored internally as meters, you can freely combine creation methods from any namespace, no matter how different the scales are:
using MarcusMedina.Units.Distance.Metric;
using MarcusMedina.Units.Distance.Microscopic;
Distance combined = 1.Meters() + 5.Angstroms();
double meters = combined.ToMeters(); // ≈ 1.0000000005Dividing one Distance by another returns a plain double ratio (not a Distance), useful for "how many times bigger" comparisons:
using MarcusMedina.Units.Distance.Astronomical;
using MarcusMedina.Units.Distance.Metric;
Distance lightYear = 1.LightYears();
Distance km = 1.Kilometers();
double ratio = lightYear / km; // ≈ 9.46e12Dividing a Distance by a double instead scales it down and still returns a Distance:
Distance half = lightYear / 2.0;Distance implements IComparable<Distance> and all six comparison operators, so distances from unrelated unit families compare correctly without manual conversion:
using MarcusMedina.Units.Distance.Astronomical;
using MarcusMedina.Units.Distance.Metric;
bool farther = 1.LightYears() > 100.Kilometers(); // trueDistance.ToString() prints the meter value using invariant culture, formatted as "{value} m":
Console.WriteLine(5.Kilometers()); // "5000 m"There is no built-in support for formatting in a different unit — call the relevant To...() method and format the double yourself.
MarcusMedina.Units.Distance.Astronomical includes ToKesselRun(this Distance d), which always throws an InvalidOperationException explaining that a parsec is a unit of distance, not time — a nod to the famous Star Wars line and a reminder to reach for ToLightYears() instead:
using MarcusMedina.Units.Distance.Astronomical;
12.Parsecs().ToKesselRun();
// throws InvalidOperationException:
// "A parsec (12.00 pc) is a unit of distance, not time. ..."