@IT会議室は、2009年4月15日に新システムに移行し、さらに2012年5月29日にITエンジニアに特化した
質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用くださいませ。
- PR -

C#.NETで別クラスの構造体の参照方法について

投稿者投稿内容
miyavi
常連さん
会議室デビュー日: 2006/12/07
投稿数: 27
投稿日時: 2008-12-08 11:06
お世話になります。

C#.NETの勉強をしています。
メインソースと変数定義用のソースを別クラスで管理しようと考えているのですが、
構造体の記述方法が分かりません。

例えば座標(x,y)を格納する構造体変数を定義する際に、
クラス:ClsHensu 構造体:stru_test(要素:int x,int y)とした場合、

コード:
private ClsHensu c_hensu = new ClsHensu();
//座標(5,3)を格納
c_hensu.stru_test.x = 5;
c_hensu.stru_test.y = 3;


このように.演算子で変数を呼び出したいと思い、色々と方法を考えたのですが、
方法が思い浮かびません。

構造体でなければ、以下のコードで変数の呼出は可能でした。

コード:
class ClsHensu
{
    private int intZahyo_X;
    private int intZahyo_Y;

    public int Zahyo_X
    {
        set { intZahyo_X = value; }
        get { return intZahyo_X; }
    }

    public int Zahyo_Y
    {
        set { intZahyo_Y = value; }
        get { return intZahyo_Y; }
    }
}

class ClsMain
{
    private ClsHensu c_hensu = new ClsHensu();

    private void setZahyo
    {
        c_hensu.Zahyo_X = 5;
        c_hensu.Zahyo_Y = 3;
    }

}


ただ、この方法では、x座標とy座標をセットで管理できないため、
出来れば構造体を使用したいと考えております。

別クラスに作成した構造体を呼び出す方法について、
恐れ入りますが方法をお教え頂けますでしょうか。

環境は、WindowsXP SP2、VS.NET 2005です。

よろしくお願いいたします。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2008-12-08 11:23
こんにちわ。

引用:

ただ、この方法では、x座標とy座標をセットで管理できないため、
出来れば構造体を使用したいと考えております。



もし、要件がこれだけなのであれば、
System.Drawing.Pointを見てみるといいかもしれません。

まあそれはともかくとして、何故構造体としたいのでしょう?
x座標とy座標のセット管理であれば、次のようなコードで可能であると思います。
コード:

class ClsHensu
{
private int intZahyo_X;
private int intZahyo_Y;

public int Zahyo_X
{
get { return intZahyo_X; }
}

public int Zahyo_Y
{
get { return intZahyo_Y; }
}

public void SetZahyo(int x, int y)
{
intZahyo_X = x;
intZahyo_Y = y;
}
}

// もしくは、コンストラクタで設定し、あとは取得できるようにする。
class ClsHensu
{
private int intZahyo_X;
private int intZahyo_Y;

// コンストラクタ
public ClsHensu(int x, int y)
{
intZahyo_X = x;
intZahyo_Y = y;
}

public int Zahyo_X
{
get { return intZahyo_X; }
}

public int Zahyo_Y
{
get { return intZahyo_Y; }
}
}

class ClsMain
{
private ClsHensu c_hensu = new ClsHensu();

private void setZahyo
{
c_hensu.SetZahyo(5, 3);
}
}



構造体にすることで、何を望むのか、その点を明らかにしたほうがよろしいのではないかと思います。
http://msdn.microsoft.com/ja-jp/library/saxz13w4(VS.80).aspx

[追記]
もしくはこういうことですかね?
http://msdn.microsoft.com/ja-jp/library/0taef578(VS.80).aspx

[ メッセージ編集済み 編集者: Toshi 編集日時 2008-12-08 11:30 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-12-08 15:00
引用:

miyaviさんの書き込み (2008-12-08 11:06) より:

例えば座標(x,y)を格納する構造体変数を定義する際に、
クラス:ClsHensu 構造体:stru_test(要素:int x,int y)とした場合、

コード:
private ClsHensu c_hensu = new ClsHensu();
//座標(5,3)を格納
c_hensu.stru_test.x = 5;
c_hensu.stru_test.y = 3;


このように.演算子で変数を呼び出したいと思い、色々と方法を考えたのですが、
方法が思い浮かびません。



どうしても構造体にしたいのであれば、
コード:
private ClsHensu c_hensu = new ClsHensu();
//座標(5,3)を格納
stru_test p = new stru_test();
p.x = 5;
p.y = 3;
c_hensu.stru_test = p;


とするか、または
コード:
stru_testのコンストラクタで、引数を取るようにした上で、

private ClsHensu c_hensu = new ClsHensu();
//座標(5,3)を格納
c_hensu.stru_test = new stru_test(5, 3);


とするかのいずれか。
miyavi
常連さん
会議室デビュー日: 2006/12/07
投稿数: 27
投稿日時: 2008-12-09 01:29
>Toshiさん、かずくんさん

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

構造体を必ずしも使用する必要は無いのですが、後学の為に学ぼうと考えておりました。

関数を使う方法は思いついたのですが、.演算子を使う(=で値を渡す)方が、他の変数と同じように使える為、使い勝手が良いと思うので実現方法を探していました。

回答の内容からすると出来なさそうですね。
構造体を強引に使うメリットはなさそうです。

そもそも、変数を扱うクラスを2つ用意して、片方を座標専用にすれば構造体のように使えると思いました。
というか、最初から気づけよって話ですが・・・。

Toshiさんに教えて頂いたpointクラス?については存在を知りませんでした。
座標を扱う時に有効に使えそうなので、調べてみます。

情報ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-12-09 07:35
cls とか stru といった、意味のないシステム ハンガリアンはやめましょう。
もっと、コードを文書として読むときに意味のある、言葉にしましょう。
miyavi
常連さん
会議室デビュー日: 2006/12/07
投稿数: 27
投稿日時: 2008-12-10 02:04
>Jittaさん

ご指摘ありがとうございます。

変数の頭には変数の型を付けるようにしているのですが、
その癖でクラスや構造体まで同じにしていましたね。

正直なところ、変数に意味のある名前を付けるのが苦手なのですが、
Jittaさんのお勧めの命名規則はありますか。

「int型の定数」「string型の変数」「別クラスにある配列double型の変数」のように
上げれば切りがないですが、
これらをうまく認識できるような命名規則があれば是非使いたいと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-12-10 09:12
引用:

miyaviさんの書き込み (2008-12-10 02:04) より:

これらをうまく認識できるような命名規則があれば是非使いたいと思います。


名前で認識させようと思っている限りは無理でしょう。
http://msdn.microsoft.com/ja-jp/library/ms229002(VS.80).aspx

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
miyavi
常連さん
会議室デビュー日: 2006/12/07
投稿数: 27
投稿日時: 2008-12-11 00:52
スレの内容と少々ずれてきましたが、折角ご指摘頂いておりますので、
継続しようと思います。

>じゃんぬねっとさん
ご指摘ありがとうございます。
お蔭様で、Jittaさんのおっしゃるハンガリアンの意味が分かりました。

お恥ずかしい限りなのですが、頭文字にintやstrなどのハンガリアンライク?な変数名を
今まで使っており、これが普通と思っておりました。

何度も質問して恐縮ですが、ハンガリアン記法とならない変数の命名について、
サンプルなどお教え頂けますでしょうか。

私のイメージとしては、
 string Hankaku; //半角文字(string型)
 int Mojisu; //文字数(int型)
 double Shosu; //少数(double型)

こんなイメージを持っています。
一応、意味のある変数名なので、jittaさんの要求は満たしているように思うのですが・・・。

ただ、これだと複数人で開発をする時など、変数がどの型なのか一々調べる必要がありますよね。
「調べる手間 < 変数の型変更などに伴う変数名との不整合による手間」という事でしょうか。
また、グローバル変数とローカル変数も、特に命名規則で区別しないのでしょうか。
(経験上、これは影響が大きいかな、と思いまして。使わなければいい話ではありますが。)

無知識で大変恐縮ですが、お教え頂けると幸いです。

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

スキルアップ/キャリアアップ(JOB@IT)