DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#のstructの配列要素を別名でアクセスしたい。

環境/言語:[言語 : C#]
分類:[その他]

【解決したい問題】

C#のstructの配列のある要素を参照したい場合に、
コピーではなくポインタ的に別名でアクセスすることは出来るでしょうか?

条件として、
・structをclassに変更することは出来ない。
・unsafeは使えない。
・別名経由で、読み込み、書き込み両方を行いたい。
・C#2.0まで。

コード例
----
struct Rect
{
public int x;
public int y;
public int w;
public int h;
}
--
void Func()
{
Rect[] rects = hoge.getRects(); // どこかから取得した、と仮定。
// 必要に応じて配列コピー。今回は省略。
int count = points.Length;
for ( int i = 0; i < count; ++i )
{
Rect r = rects[ i ]; // これだと、ただのコピーになる。
// ここを参照で処理したい。

// 以下の2行が同じ挙動になるようにしたい。
// r.x = r.x * 2;
// rects[ i ].x = rects[ i ].x * 2;
}
}
----
C++であれば、
Rect& r = rects[ i ];
と書く所なのですが…

【解決するために何をしたか】

色々キーワードを変えて検索してみましたが、
DLLとの通信関連ばかり引っ掛かってしまい
見つけることが出来ませんでした。

【追加事項】

単純な言語仕様の見落としかもしれませんが、
ご存知の方がいらっしゃいましたらご教授頂けると助かります。
強いて挙げるなら、別メソッドにしてrefで渡すことぐらいでしょうかね。


> Rect[] rects = hoge.getRects(); // どこかから取得した、と仮定。
> // 必要に応じて配列コピー。今回は省略。
.NETのクラスライブラリガイドラインでは、配列を返すときはコピーを返すことが推奨されています。
http://msdn.microsoft.com/ja-jp/library/k2604h5s.aspx
Hongliang様

ご回答ありがとうございます。

> 強いて挙げるなら、別メソッドにしてrefで渡すことぐらいでしょうかね。

単純にキーワード等では出来ないのですね。
規模にもよるとは思いますが、別メソッドが良さそうですね。
インライン展開が強制できればもっと良いのですが…


>>Rect[] rects = hoge.getRects(); // どこかから取得した、と仮定。
>>// 必要に応じて配列コピー。今回は省略。
> .NETのクラスライブラリガイドラインでは、配列を返すときはコピーを返すことが推奨されています。
> http://msdn.microsoft.com/ja-jp/library/k2604h5s.aspx

細かい部分まで見てくださってありがとうございます。
確かにコピーが返ってきてました。

コピー量多いなぁ…
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板