Discussion:
プロパティに配列?
(too old to reply)
masayan
2006-05-11 03:36:02 UTC
Permalink
始めまして、masayanと申します。

C#初心者ですが、いきなりユーザアプリ組んでいます。

ところで、C#のいろんな本を紐解いても、なかなか答えが得られず
悩んでいます。

C#の文法上、以下のようなプロパティ宣言は許されるものか。

private int [] iData = new int[5];

public int [] IntData
{
set{ iData = value; }
get{ return iData; }
}

ちなみに、VisualStudio2003で試してみましたが、
見かけ上、期待どおりの動作します。
しかしながら、デバッグすると実際にはsetに飛んできません。

 IntData[1] = 10;
int iX = IntData[1];

とかして、トレースするとどちらの行も、getに飛んできます。

こういった使い方がそもそもしてはいけないことなのか
これはこれで、このとおりなのかが不明です。

ご存知の方がおられたらご教授願います。

本来ならインデクサを使うべきとは思いますが、
この方が簡単で便利なように思いますが、いかがなものでしょう。
UETA, Shin-ichi
2006-05-11 03:49:09 UTC
Permalink
こんにちは、植田です。
Post by masayan
 IntData[1] = 10;
int iX = IntData[1];
このコードは、IntDataプロパティそのものを操作しているのではなく、
その要素の1つにアクセスしているだけなので、get()しか呼び出され
ないような気がします。

よって、正しく動いてはいるけれど、おそらくこれは意図した動きでは
ないのでしょうね。
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
masayan
2006-05-11 04:27:10 UTC
Permalink
こんにちは、masayanです。

植田様ご意見ありがとうございます。
私もなんとなくそのような気がしているんですが確証が得られず
苦慮しています。

しかも、代入そのものは配列各要素に正しく行われます。
しかしながら、setのなかでvalueの評価をしようとしたところ
評価が実行されないので、ちゃんと機能していないのではと
思ったしだいです。
Post by UETA, Shin-ichi
このコードは、IntDataプロパティそのものを操作しているのではなく、
その要素の1つにアクセスしているだけなので、get()しか呼び出され
ないような気がします。
よって、正しく動いてはいるけれど、おそらくこれは意図した動きでは
ないのでしょうね。
NAKASHIMA Michio
2006-05-17 01:47:07 UTC
Permalink
Post by masayan
private int [] iData = new int[5];
public int [] IntData
{
set{ iData = value; }
get{ return iData; }
}
$B5v$5$l$^$9!#(B

$B$?$@$7!"$3$N>l9g!"(Bget set$B$O!"G[Ns$N3FMWAG$r07$&$N$G$O$J$/$F!"(Bint$B$NG[Ns$=(B
$B$N$b$N$r07$$$^$9!#(B

set$B$O!"(BiData$B$N3FMWAG$X$NBeF~$=$N$b$N$G$O$J$/!"(BiData$B$X$NJL$NG[Ns$NBeF~$r(B
$BI=8=$9$k$3$H$K$J$j$^$9!#(B
$B6qBNE*$K$O!"(B
object.IntData = new int[6];
$B$K$h$C$F(Bset$B$,8F$S=P$5$l$^$9!#(B

$B$3$l$KBP$7$F!"(B
object.IntData[3]=3;
$B$O!"$^$:3JG<$5$l$?G[Ns$r<h$j=P$7$F!"$=$NMWAG(B[3]$B$K%"%/%;%9$7$F$$$k$@$1$G(B
$B$9$+$i!"(Bget$B$,8F$S=P$5$l$k$3$H$K$J$j$^$9!#(B

$B$@$+$i!"G[Ns<+?H$O8GDj$G!"G[Ns$NCf$NCM$K%"%/%;%9$7$?$$$@$1$J$i!"(Bset$B$***@k(B
$B8@$O$=$b$=$bITMW$G$9!#(B

$B$^$?$3$l$O!"(Bget$B$7$+MQ0U$7$F$$$J$/$F$b!"G[Ns$NCf?H$OJQ99$b$G$-$F$7$^$&$3(B
$B$H$b<($7$^$9$+$i!"M}2r$;$:$K;H$&$H!"FI$_<h$***@lMQ$N$D$b$j$GFI$_=q$-$N=PMh(B
$B$k%W%m%Q%F%#$r:n$C$F$7$^$&$3$H$K$J$j$^$9!#(B

#$B$3$NJU$N$3$H$O!"%W%m%Q%F%#$N;H$$J}$H$$$&$h$j!"$`$7$mG[NsJQ?t$X$NBeF~$H(B
$BG[NsJQ?t$N3FMWAG$X$NBeF~$N0c$$$KBP$9$kM}2r$NLdBj$@$H;W$$$^$9!#D4$Y$k$H$-(B
$B$O$=$NJU$r$"$?$C$F$_$k$HNI$$$H;W$$$^$9!#(B

---
nakashima michio
masayan
2006-05-17 02:22:01 UTC
Permalink
masayanです。

NAKASHIMA様
適切なご説明ありがとうございます。

見かけのあいまいさが残ってしまう以上
あまり、好ましくない使い方だとは思いました。

インデクサの使用も検討していきたいと思っています。
許されます。
ただし、この場合、get setは、配列の各要素を扱うのではなくて、intの配列そ
のものを扱います。
setは、iDataの各要素への代入そのものではなく、iDataへの別の配列の代入を
表現することになります。
具体的には、
object.IntData = new int[6];
によってsetが呼び出されます。
これに対して、
object.IntData[3]=3;
は、まず格納された配列を取り出して、その要素[3]にアクセスしているだけで
すから、getが呼び出されることになります。
だから、配列自身は固定で、配列の中の値にアクセスしたいだけなら、setの宣
言はそもそも不要です。
またこれは、getしか用意していなくても、配列の中身は変更もできてしまうこ
とも示しますから、理解せずに使うと、読み取り専用のつもりで読み書きの出来
るプロパティを作ってしまうことになります。
#この辺のことは、プロパティの使い方というより、むしろ配列変数への代入と
配列変数の各要素への代入の違いに対する理解の問題だと思います。調べるとき
はその辺をあたってみると良いと思います。
Loading...