C# 制作我自己的PointD结构(类似Point,但使用double):使用X和Y而不首先定义它们?

C# 制作我自己的PointD结构(类似Point,但使用double):使用X和Y而不首先定义它们?,c#,struct,point,definition,C#,Struct,Point,Definition,我正在尝试用双值创建我自己的Point结构。 我希望能够使用我的PointD的X和Y坐标,而不必首先定义它们 这里有一个例子: Point test; //Point is a part of System.Drawing int thisWorks = test.X; //here I can use X without define it first //edit: this also doesn't work, but the compile

我正在尝试用双值创建我自己的Point结构。 我希望能够使用我的PointD的X和Y坐标,而不必首先定义它们

这里有一个例子:

Point test; //Point is a part of System.Drawing
int thisWorks = test.X; //here I can use X without define it first
                        //edit: this also doesn't work, but the compiler
                        //doesn't complain, my fault!


PointD test2; //this is my own struct for double points
double thisNot = test2.X; //I can't use X, because it is not defined yet
我的极端简单点结构:

public struct PointD
{
    public double X;
    public double Y;
}

你错了。您提到的代码很好,PointF和PointD之间没有区别:

    public Form1()
    {
        InitializeComponent();

        MyStruct ms = new MyStruct();
        this.Text = ms.p.X.ToString() + ms.d.X.ToString();

    }

    public struct PointD
    {
        public double X;
        public double Y;
    }

    public struct MyStruct
    {
        public PointF p;
        public PointD d;
    }
表格1的标题如预期显示“00”

编辑:

也许您想知道,为什么在尝试直接使用未创建的结构时会出现编译器错误,但在结构中使用未创建的结构时不会出现错误。或者一个结构中的一个结构中的一个结构中的一个结构中的一个结构

这应该说明:编译器不遵循这些嵌套级别;它只是标记对它来说很明显的事情,即在其直接范围内的遗漏


诚然,这可能是一个麻烦,但总而言之,我很高兴被警告,而不是被允许忘记初始化。

看起来你知道
System.Drawing.Point
(可能还有
System.Drawing.PointF
),但是,就像我第一次需要使用这些类一样,您希望具有相同的功能,但使用的是
double
而不是
int
(或
float

好的,然后我发现了
System.Windows.Point
,它使用了
double
,工作方式基本相同,只是它是在其他.NET程序集中定义的(您需要添加其他引用)

顺便说一下,还有非常有用的结构
System.Windows.Vector
System.Windows.Media.Media3D.Point3D
System.Windows.Media.Media3D.Vector3D
。这些包括本机向量算法(将一个向量添加到一个点并获得另一个点,添加两个向量并获得一个新向量,等等)以及经常要求的点积和叉积


(评论中提到了struct
System.Windows.Point
,但考虑到OP明确的需求,这种“切向”的方式让我觉得它应该有自己的答案)。

你试过你发布的内容吗?它很好用。结构的所有字段默认初始化为
default(T)
,这通常是
null
0
。事实上,MSDN页面上的示例“Using Structs”(使用结构)明确包括一个名为“Declare A struct object With new(声明结构对象而不新建)”的示例,这是
System.Drawing.Point
的源代码。请考虑<代码>系统.Windows .Point < /C> >已使用<代码>双 S > <代码> x>代码>和<代码> y>代码>请记住,如果<代码>点测试,
是一个类的字段,它将自动初始化,就像它说的
private Point test=default(Point)。但是,如果<代码>点测试
是方法的局部变量,但情况并非如此。然后必须显式地分配(初始化)。我敢打赌,这就是你困惑的根源。您自己的结构与
System.Drawing.Point
的语义已经差不多了。@JeppeStigNielsen我还要感谢您对上述内容的解释。一开始我不明白,你用的是新的,所以p和d是自动定义的。我尽量避免新的。您也只设置了值,如果没有首先在Form1()中定义它,就不会读取该值。我的目标是能够使用类似点的点。没有新的和没有定义PointD=example后的值;但是谢谢你抽出时间。也许我不是特别的伊诺斯。再说一次:你错了。我没有设置任何值,是的,必须创建MyStruct(即使没有PointD成员!!);不是的,如果不确定它们是否赋值,你就不能使用Point、Pointf甚至int。你没有先设置值,我搞错了,对不起。另外,您的代码在不直接在PointD上使用new的情况下也可以工作。现在我必须找出为什么在将PointF更改为PointD之后会出现所有空异常。谢谢你的认知。我希望我的编辑能把事情做好;我从未想过这件事,但它并不像我最初想的那么明显。。