可通过 C# 中的参数传递的自定义数字后缀

Custom Numeric Suffix Passable through Arguments in C#

我有一个传递 "custom" 3D 坐标的应用程序。坐标可以是绝对坐标也可以是相对坐标。

我一直在考虑为每个值 x、y、z 表达这个的快速方法,而不必有一个包含该值的多维数组和一个关于该值是相对值还是绝对值的布尔值。

我试图避免的示例:

Coordinate c = new Coordinate({100.0,true},{25.0,false},{100.0,true}):

我想到的一种方法是使用用户定义的文字,例如 100.0F 除了使用基于十进制的运算符,例如 100.0A 和 [=14=,而不是预先存在的文字] 对于仅与 Coordinate class 关联的亲戚。这可能吗?

我的目标示例:

public void SomeMethod(Coordinate 50.0R, Coordinate 25.0A, Coordinate 50.0R) 
{ 
    //... 
}

或者,如果这是不可能的,是否有其他简单的方法来传递基于十进制的数字,并带有附加指示符以判断它们是绝对的还是相对的?

您不能在 C# 中定义自己的自定义后缀。我假设最常见的用例是所有坐标都是相对的,或者所有坐标都是绝对的,那么为什么不为这些情况在 Coordinate class 上定义两个静态方法:

var location = Coordinate.Relative(100.0, 25.0, 100.0);
var target = Coordinate.Absolute(100.0, 25.0, 100.0);

您还可以使构造函数采用固定数量的维度,而不是数组:

var location = new Coordinate(100.0, true, 25.0, false, 100.0, true);

新的 ValueTuple 将提供一种非常简洁的语法来表达您想要实现的目标。

元组将提供更直观的语法。

using System;

namespace test
{
    class Program
    {
        public class Coordinate
        {
            public Coordinate((double Value, bool IsRelative) x, (double Value, bool IsRelative) y, (double Value, bool IsRelative) z)
            {
                X = x;
                Y = y;
                Z = z;
            }
            public (double Value, bool IsRelative) X { get; }
            public (double Value, bool IsRelative) Y { get; }
            public (double Value, bool IsRelative) Z { get; }

            public override string ToString()
            {
                return $"({X},{Y},{Z})";
            }
        }

        public static void SomeMethod(Coordinate coordinate)
        {
            Console.WriteLine(coordinate);
            Console.WriteLine(coordinate.X.Value);
            Console.WriteLine(coordinate.Y.IsRelative);
        }

        public static void Main()
        {
            var c = new Coordinate((100.0, true), (25.5, false), (100, true));
            SomeMethod(c);
            Console.ReadKey();
        }
    }
}

您确实需要 ValueTuple nuget 包和 C# 7