C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: アクセサでの構造体の配列のアクセス記述方法について


(過去ログ 10 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■2059 / inTopicNo.1)  アクセサでの構造体の配列のアクセス記述方法について
  
□投稿者/ アーラン (1回)-(2007/03/16(Fri) 10:55:13)

分類:[C# (Windows)] 

言語 Visual C#2005
開発環境 Windows Xp Home Edition

要点:
  クラスの中に配列をメンバとした構造体の配列があります。
  このメンバをプロパティとしてアクセスしたいのですが記述の方法がわかりません。
  アクセサの記述方法を教えていただけないでしょうか。
  よろしくお願いいたします。

詳細:
  myClassの中にMyStructTypeの構造体の配列myStructがあります。
  このmyStructの中にMyStructIntMenberの配列とMyStructBoolMemberの配列があります。
  インデクサを使用するとMyStructIntMenberまたはMyStructBoolMemberのどちらかのアクセサの記述はできます。
  私の希望としてはMyStructIntMenberとMyStructBoolMemberのそれぞれをクラスのプロパティとしてアクセスするアクセサの記述方法が知りたいのです。

サンプル:
  新規プロジェクトにtextBox1とmenuStrip1を貼り付けてあります。

=================================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace win_accessor {
    public partial class Form1 : Form {

        private MyClass myClass;

        public Form1() {
            InitializeComponent();
            myClass = new MyClass();
        }

        private class MyClass {
            
            private struct MyStructType {
                public int[] MyStructIntMember;
                public bool[] MyStructBoolMember;
            }

            private MyStructType[] myStruct;

            // 初期化
            public MyClass () {
                myStruct = new MyStructType[20];
                for (int i = 0; i < myStruct.Length; i++) {
                    myStruct[i].MyStructIntMember = new int[5];
                    for (int j = 0; j < myStruct[i].MyStructIntMember.Length; j++) {
                        myStruct[i].MyStructIntMember[j] = 0;
                    }
                    myStruct[i].MyStructBoolMember = new Boolean[10];
                    for (int j = 0; j < myStruct[i].MyStructBoolMember.Length; j++) {
                        myStruct[i].MyStructBoolMember[j] = false;
                    }
                }
            }

            // インデクサによるアクセサ
            public int this[int a, int b]{
                get {
                    return myStruct[a].MyStructIntMember[b];
                }
                set {
                    myStruct[a].MyStructIntMember[b] = value;
                }
            }
        }

        // プロパティのアクセスの実験(読み出し)
        private void toolStripMenuItem2_Click(object sender, EventArgs e) {
            textBox1.AppendText(myClass[1, 1].ToString() + "\r\n");
        }

        // プロパティのアクセスの実験(書き込み)
        private void toolStripMenuItem3_Click(object sender, EventArgs e) {
            myClass[1, 1] = 1;
        }
    }
}

引用返信 編集キー/
■2062 / inTopicNo.2)  Re[1]: アクセサでの構造体の配列のアクセス記述方法について
□投稿者/ Hongliang (123回)-(2007/03/16(Fri) 11:58:12)
Hongliang さんの Web サイト
つまり、
public int this[int x, int y] { get; set; }

public bool this[int x, int y] { get; set; }
の二つを定義したいって事ですか?
当然無理です。
呼び出し側が myClass[0, 0] とやったときにその呼び出し側は果たして何型が返ることを期待しているんでしょうか?

素直に Get/Set メソッドにするのが得策でしょう。
引用返信 編集キー/
■2064 / inTopicNo.3)  Re[1]: アクセサでの構造体の配列のアクセス記述方法について
□投稿者/ アーラン (2回)-(2007/03/16(Fri) 13:06:55)
>当然無理です。

やっぱし。そうですよね。

>呼び出し側が myClass[0, 0] とやったとき

myClass[n].MyStructIntMember[n] とか myClass[n].MyStructBoolMember[n] などの型式でアクセスすることを考えています。
このような記述もできないのでしょうか。

引用返信 編集キー/
■2065 / inTopicNo.4)  Re[2]: アクセサでの構造体の配列のアクセス記述方法について
□投稿者/ よねKEN (18回)-(2007/03/16(Fri) 13:31:12)
よねKEN さんの Web サイト
> myClass[n].MyStructIntMember[n] とか myClass[n].MyStructBoolMember[n] などの型式でアクセスすることを考えています。
> このような記述もできないのでしょうか。

private MyStructType[] myStruct;

これに対するMyStructType[]型を公開するプロパティでできませんか?


引用返信 編集キー/
■2066 / inTopicNo.5)  Re[3]: アクセサでの構造体の配列のアクセス記述方法について
□投稿者/ アーラン (3回)-(2007/03/16(Fri) 13:45:43)
>これに対するMyStructType[]型を公開するプロパティでできませんか?

すみません。意味がよく理解できません。記述例のサンプルなどありますでしょうか?

引用返信 編集キー/
■2067 / inTopicNo.6)  Re[4]: アクセサでの構造体の配列のアクセス記述方法について
□投稿者/ よねKEN (19回)-(2007/03/16(Fri) 13:56:31)
よねKEN さんの Web サイト
2007/03/16(Fri) 13:57:09 編集(投稿者)
No2066 (アーラン さん) に返信
> >これに対するMyStructType[]型を公開するプロパティでできませんか?
> 
> すみません。意味がよく理解できません。記述例のサンプルなどありますでしょうか?
> 

一部訂正です。
インデクサを使うので、MyStructType[]型ではなくMyStructType型を公開するプロパティですね。
で、この件について実験してみました。
MyStructTypeをprivateからpublicにして、インデクサを以下のようにすればご希望のことができました。

  public MyStructType this[int n]{
        get {
            return myStruct[n];
        }
        set {
            myStruct[n] = value;
        }
    }

引用返信 編集キー/
■2068 / inTopicNo.7)  Re[5]: アクセサでの構造体の配列のアクセス記述方法について
□投稿者/ アーラン (4回)-(2007/03/16(Fri) 14:16:34)
希望のことができました。
以下に検証コードを示します。
どうもありがとうございました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace win_accessor {
    public partial class Form1 : Form {

        private MyClass myClass;

        public Form1() {
            InitializeComponent();
            myClass = new MyClass();
        }

        private class MyClass {
            
            public struct MyStructType {
                public int[] MyStructIntMember;
                public bool[] MyStructBoolMember;
            }

            private MyStructType[] myStruct;

            // 初期化
            public MyClass () {
                myStruct = new MyStructType[20];
                for (int i = 0; i < myStruct.Length; i++) {
                    myStruct[i].MyStructIntMember = new int[5];
                    for (int j = 0; j < myStruct[i].MyStructIntMember.Length; j++) {
                        myStruct[i].MyStructIntMember[j] = 0;
                    }
                    myStruct[i].MyStructBoolMember = new Boolean[10];
                    for (int j = 0; j < myStruct[i].MyStructBoolMember.Length; j++) {
                        myStruct[i].MyStructBoolMember[j] = false;
                    }
                }
            }

            // インデクサによるアクセサ
            public MyStructType this[int n] {
                get {
                    return myStruct[n];
                }
                set {
                    myStruct[n] = value;
                }
            }
        }

        // プロパティのアクセスの実験(読み出し)
        private void toolStripMenuItem2_Click(object sender, EventArgs e) {
            textBox1.AppendText(myClass[1].MyStructIntMember[1].ToString() + "\r\n");
            textBox1.AppendText(myClass[1].MyStructBoolMember[1].ToString() + "\r\n");
        }

        // プロパティのアクセスの実験(書き込み)
        private void toolStripMenuItem3_Click(object sender, EventArgs e) {
            myClass[1].MyStructIntMember[1] = 1;
            myClass[1].MyStructBoolMember[1] = true;
        }
    }
}

解決済み
引用返信 編集キー/
■2069 / inTopicNo.8)  Re[6]: アクセサでの構造体の配列のアクセス記述方法について
□投稿者/ 梅林 (10回)-(2007/03/16(Fri) 15:37:18)
梅林 さんの Web サイト
以前Blogに、配列型プロパティを簡単に作るための方法を投稿しました。
よろしければどうぞ。

http://blogs.wankuma.com/umebayashi/archive/2007/02/08/61500.aspx

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -