1

カスタム構造体とクラスを作成しました。構造体は 3D 空間のポイントです。

public struct Point3D
{
    //fields
    private static Point3D center = new Point3D(0,0,0);

    //properties
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }
    public static Point3D Center { get { return center; } }

    //constructors
    public Point3D(int x, int y, int z) : this()
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }

    public override string ToString() { return string.Format("({0}; {1}; {2})", this.X, this.Y, this.Z); }
}

カスタムクラスは、ポイントを保存することになっているパスです:

public class Path
{
    private List<Point3D> storedPoints = new List<Point3D>();

    public List<Point3D> StoredPoints { get; set; }

    public void AddPoint(Point3D point) { this.StoredPoints.Add(point); }

    public void DeletePointAt(int index) { this.StoredPoints.RemoveAt(index); }

    public void ClearPath() { this.StoredPoints.Clear(); }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        foreach (var item in this.StoredPoints)
        {
            sb.Append(item);
            sb.Append(System.Environment.NewLine);
        }
        return sb.ToString();
    }
}

空のリスト List\ を持つインスタンスを常に持ちたいので、パス クラスのコンストラクターは作成していません。ただし、プログラムを実行すると、NullReferenceException が発生します。これは、メイン メソッドのコードです。

    static void Main(string[] args)
    {
        Point3D point1 = new Point3D(-2, -4, -10);
        Point3D point2 = new Point3D(6, 7, 8);
        Path path1 = new Path();
        path1.AddPoint(point1);
        path1.AddPoint(point2);
        path1.AddPoint(new Point3D(2, 4, 6));
        path1.AddPoint(new Point3D(-9, 12, 6));
        Console.WriteLine(path1);
    }

最初のポイントを追加しようとするとエラーが発生します。デバッガーでは、最初のポイントを追加する前に Path オブジェクトの値が null になっていることがわかりますが、コンストラクターを記述せずにこの問題を解決するには、少なくとも 1 つのポイントをパラメーターとして取ります。つまり、空のパスを作成します。

4

3 に答える 3

1

関係のない2 人のメンバーstoredPointsがいます。StoredPoints

StoredPointsのゲッターを明示的に書き出して、それを返すようにする必要がありますstoredPoints

(また、作成した構造体は変更可能な構造体です。これは多くの人が危険だと考えています。)

于 2013-06-06T14:04:20.170 に答える
1
public List<Point3D> StoredPoints { get; set; }

を呼び出しているときにAddPoints、初期化されていないプロパティにアクセスしようとしています。StoredPointsプロパティを使用する前に、次のことを行う必要があります。

StoredPoints = new List<Point3D>();
于 2013-06-06T14:09:26.090 に答える