2017-10-10 3 views
0

参照型をメソッドに値渡ししたときに値をインスタンスに再割当てできることを示す例を複製しようとしています渡された型自体は再割り当てしません。これはAndrew Troelsenの本のものです。渡し型参照型を値で渡しますが、インスタンス変数がメソッドによって再割り当てされていません

Rectangle r1 = new Rectangle("Numero", 10, 10, 10, 10); 
Rectangle r2 = new Rectangle(); 
ChangeRect(r1); 
Console.WriteLine(r1.top); 

コンストラクタの矩形内の2番目の引数は、「トップ」変数(int型)です: ここではコードです。

ChangeRect方法は次のとおりです。

static void ChangeRect(Rectangle e) 
{ 
    e.top = 1; 
    e = new Rectangle(); 
} 

私はこれを実行すると、私はr1.topの値が1に変更することを期待、しかし、デフォルトコンストラクタを持つ新しいオブジェクトへのR1オブジェクトの再割り当て無視される。 しかし、r1でChangeRect()メソッドを呼び出した後、r1.topの値を表示すると、10が表示され続けます。 何が欠けていますか?

+0

[mcve]を入力してください。私はあなたが私たちに示していないコードに問題があると思う。 –

+0

なぜ再割り当てが無視されると思いますか?私が最後にチェックしたのは、オブジェクトを変更したい場合は値ではなく参照でオブジェクトを渡す必要があるということです。 – VTodorov

+0

「長方形」とは何ですか?どのように定義されていますか? – David

答えて

0

Rectanglestructであり、したがって値の型です。パラメータを変更して新しいインスタンスを作成する場合は、パラメータにrefを追加して戻り値の型を設定します。

static Rectangle ChangeRect(ref Rectangle e) 
{ 
    e.top = 1; 
    return new Rectangle(); 
} 

それを呼び出すと、

Rectangle newRect = ChangeRect(ref r1); 

私は、渡される値を変更し、新しいインスタンスを返すことはChangeRectと呼ばれる方法のための奇妙な行動であること。けれども指摘したいですおそらく、SetTopAndGetNew()に名前を変更するか、2つの操作を分離することを検討してください。

+1

最初の部分は正しいですが、 'ref'を渡すと、最初の質問文で説明した動作を示す目的が無効になります。 – grek40

+1

"Rectangleは構造体です" - これは「Rectangle」型ですか? (どこから来ていても、「Top」ではなく、アクセス可能な 'top'フィールドまたはプロパティを持たなければならないことを念頭に置いてください。そして、最初のパラメータとして文字列を受け入れるコンストラクタ) –

+0

DiskJunky、これは私のものです行方不明代わりにRectangle型をClassに変更しました。それが判明したとき、私は参照型を値として渡していないので、あなたが指摘したように、それが問題でした。しかし、それが構造体であることはどうでしたか?私は質問でこれを指定しなかった。 Jon Skeetが正しく疑っていたので、問題はコード内にありました。実際には表示されませんでした。 – NeoTrader

関連する問題