Units of measure in C# - almost

后端 未结 12 1236
再見小時候
再見小時候 2020-11-27 10:29

Inspired by Units of Measure in F#, and despite asserting (here) that you couldn\'t do it in C#, I had an idea the other day which I\'ve been playing around with.

         


        
相关标签:
12条回答
  • 2020-11-27 11:03

    Here's my concern with creating units in C#/VB. Please correct me if you think I'm wrong. Most implementations I've read about seem to involve creating a structure that pieces together a value (int or double) with a unit. Then you try to define basic functions (+-*/,etc) for these structures that take into account unit conversions and consistency.

    I find the idea very attractive, but every time I balk at what a huge step for a project this appears to be. It looks like an all-or-nothing deal. You probably wouldn't just change a few numbers into units; the whole point is that all data inside a project is appropriately labeled with a unit to avoid any ambiguity. This means saying goodbye to using ordinary doubles and ints, every variable is now defined as a "Unit" or "Length" or "Meters", etc. Do people really do this on a large scale? So even if you have a large array, every element should be marked with a unit. This will obviously have both size and performance ramifications.

    Despite all the cleverness in trying to push the unit logic into the background, some cumbersome notation seems inevitable with C#. F# does some behind-the-scenes magic that better reduces the annoyance factor of the unit logic.

    Also, how successfully can we make the compiler treat a unit just like an ordinary double when we so desire, w/o using CType or ".Value" or any additional notation? Such as with nullables, the code knows to treat a double? just like a double (of course if your double? is null then you get an error).

    0 讨论(0)
  • 2020-11-27 11:05

    Now such a C# library exists: http://www.codeproject.com/Articles/413750/Units-of-Measure-Validator-for-Csharp

    It has almost the same features as F#'s unit compile time validation, but for C#. The core is a MSBuild task, which parses the code and looking for validations.

    The unit information are stored in comments and attributes.

    0 讨论(0)
  • 2020-11-27 11:07

    there is jscience: http://jscience.org/, and here is a groovy dsl for units: http://groovy.dzone.com/news/domain-specific-language-unit-. iirc, c# has closures, so you should be able to cobble something up.

    0 讨论(0)
  • 2020-11-27 11:10

    Why not use CodeDom to generate all possible permutations of the units automatically? I know it's not the best - but I will definitely work!

    0 讨论(0)
  • 2020-11-27 11:12

    You could add extension methods on numeric types to generate measures. It'd feel a bit DSL-like:

    var mass = 1.Kilogram();
    var length = (1.2).Kilometres();
    

    It's not really .NET convention and might not be the most discoverable feature, so perhaps you'd add them in a devoted namespace for people who like them, as well as offering more conventional construction methods.

    0 讨论(0)
  • 2020-11-27 11:16

    See Boo Ometa (which will be available for Boo 1.0): Boo Ometa and Extensible Parsing

    0 讨论(0)
提交回复
热议问题