0

我有一个传递“自定义”3D 坐标的应用程序。坐标可以是绝对的或相对的。

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

我试图避免的例子:

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

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

我的目标示例:

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

或者,如果这是不可能的,是否有其他非笨拙的方法来传递基于十进制的数字,并附加指示它们是绝对的还是相对的?

4

2 回答 2

2

新的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();
        }
    }
}

你确实需要ValueTuplenuget 包和 C# 7

于 2017-11-22T05:56:41.413 回答
1

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

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);
于 2017-11-22T05:14:21.887 回答