0

指定された構造ポイント:

public struct Point {
    double x, y;
    Point(double i, double j) {
        x=i;
        y=j;
    }
}

Q1 :次の違いは何ですか:

Point p;

Point p=new Point(2.0,3.0);

私が理解しているように、2 番目の部分では匿名の Point 構造体がヒープに割り当てられ、スタックに割り当てられた p 変数のメモリにビットごとにコピーされています。私は正しいですか?

Q2 : スタックに割り当てて値で渡すのではなく、Point への参照を保持するにはどうすればよいですか? (安全でないポインターを使用しない場合)

class Linear {
    private double m, n;
    ref Point p = new Point(2.0,3.0); // not compiling
} 
4

4 に答える 4

1
class Wrapper
{
    public Point Point { get; set; }
}

値型(構造体)をラップする参照型(クラス)を使用して、ヒープに割り当てます。

于 2012-07-05T10:26:43.080 に答える
1

A1: 最初のステートメントでは変数を宣言しているだけで、2 番目のステートメントのように構造体のインスタンスを作成していません。

A2: REF キーワードは、変数を宣言する場所ではなく、別のメソッドにオブジェクトを「与える」場所で使用する必要があります。

于 2012-07-05T10:28:00.130 に答える
0

valuetype 構造体が必要ない場合は、通常、非常に単純なクラスを作成します。あなたの例では、以下のコードのようになります。クラスは、状況によっては、構造体のボックス化/ボックス化解除のパフォーマンス ヒットを防ぎます。ただし、構造体の List<> がある場合、それはすべてのデータに対して単一のメモリ ブロックです。List<> of class を使用すると、多くのクラス インスタンスへのポインターの単一ブロックを取得できます。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Point
{
    public double x, y;

    public Point(double i, double j)
    {
        x = i;
        y = j;
    }
}
于 2012-07-05T10:33:26.977 に答える
0

2 番目のステートメントでは、型の匿名の一時記憶域の場所Pointが作成され、おそらくスタック上に作成され、暗黙的refなパラメーターとしてパラメーター化されたコンストラクターに渡されます。コンストラクターが完了すると、Point変数pは、各フィールド (パブリックまたはプライベート) をその匿名の一時ファイルの対応するフィールドで上書きすることによって変更され、その後破棄されます。構造体が不変であるかどうかにかかわらず、動作は同じであることに注意してください。

于 2012-07-06T17:15:57.673 に答える