C# コレクションクラスのメソッド設計について

このQ&Aのポイント
  • C#のコレクションクラスにおいて、インデクサとGet/Set Valueメソッドをどちらを元にするか迷っています。
  • インデクサを使う場合、メソッド呼び出しのオーバーヘッドが減りますが、拡張性を考えてメソッドを元にすることも検討しています。
  • 皆さんのご意見をお聞かせください。
回答を見る
  • ベストアンサー

c# どちらを元にするか

 こんにちは、c#初心者です。  c#にとっては、とてもくだらない質問なんですが、気になったので質問しました。  コレクションクラスなんかで、良くインデクサを使いますよね? で、インデクサだけではなく、仕様上「GetValue」、「SetValue」メソッドなんかも実装しなければならないとします。  どちらも挙動は同じだからといって、保守性からしてコピペするには長い(2行以上、ただし、virtualではない)ので、どちらかをもう一方のメソッドを呼び出すものにしたいのですが、皆さんならどうなさるでしょうか?  確率的にはインデクサを使う可能性が高いので、インデクサを元にしてGet/SetValueメソッドはインデクサを呼び出す形にしておけば「メソッド呼び出しのオーバーヘッドが一回分減る 可能性が高い」といっても限界のチューニングは必要ないので、  それだったら、今後「virtual」にすることも考えて、オーバーロードしやすいようにメソッドを元にして、インデクサはGet/Set Valueメソッドを呼び出す形にした方が見た目もややすっきりするかなと。  皆さんならどうなさいますか? ご意見を伺わせてください(本当につまらない質問ですみません)。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

表現が異なるだけでナカミが同じなら、よりツブシの効く方をベースにします。 僕はインデクサ/プロパティは糖衣構文(読みやすく/書きやすくするためのオマケ)と考えるので、 メソッドが必須なのであればメソッドきっちり書いてそっちをベースにインデクサ/プロパティを実装するですね。

koumei000
質問者

お礼

 回答ありがとうございます。  やっぱりそうですよね。安心しました。

関連するQ&A

  • C#で実行時にメソッドの返り値の型を変化させる

    C# で、実行時にメソッドの返り値の型を変化させることは可能でしょうか? たとえば、 public class MyData { object o; public void setValue( object a ) { o = a; } public object getValue() { return o; } } というクラスがあるとき、 static void Main(string[] args) { MyData a = new MyData(); a.setValue( 3 ); Console.WriteLine( a.getValue().GetType().ToString() ); int i = (int)a.getValue(); } というコードを実行すると、 System.Int32 と表示されます。Main の 4 行目で、(int)のキャストをはずすと、object から int への暗黙の変換はできませんというコンパイルエラーになります。 この(int)のキャストをしなくてもエラーにならないような getValue の関数はできないでしょうか? o は、数値型であるとします。 たとえば、MyData に、 public int getInt() { return (int)o; } とすれば、必ず int を返すようなメソッドはできると思うのですが、これだと、getByte() や、getDouble() などのように、考えられるすべての型を想定してメソッドを作ることになってしまいます。 そうではなく、getValue() で、少なくとも数値型の暗黙の変換はしてくれるようなことにできないでしょうか。 よろしくお願いします。

  • C#の動的キャスト

    いつもお世話になっています。 C#の動的キャストに関する質問です。 C#のメソッドにobjectの引数を渡して動的にキャストする場合 void Hoge(object obj) { Type t = Type.GetType(obj); objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1) ................................. } のようにされています。 しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。 逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。 そこで質問ですが、何とかType t から「objの型」を取得して(1)記法による動的キャストを行う方法はないでしょうか? GetMethod, GetPropertyでメソッド,プロパティを取得し、Invoke, GetValue, SetValueすることは可能ですが、できればドット記法(.)が使える (1) のような動的キャストを行いたいと考えています。 よろしくお願いします。

  • c# 行と列 どっちが先?

     こんにちは。c#初心者です。  インデクサやメソッドなどで行を表す引数と、列を表す引数のどちらを先に持って来ればよいか分からず質問させてもらいました。  具体的には  int this[int row, int column] { get; set; } なのか、  int this[int column, int row] { get; set: }  なのかで迷っています。最初は前者で作るつもりだったのですが、「TableLayoutControlCollection」によると、  public void Add(Control control, int column, int row)  のようになっており、後者の順だったので分からなくなってしまいました。  どなたかご存知の方がいらっしゃいましたら教えていただけませんか?

  • C#変数の扱い

    C#(VS)でデスクトップアプリを開発しています。 初歩的な質問です。 メソッド内で、宣言した変数を使おうとすると 「宣言されているが割り当てられていない。。」 といって使えません (因みに、intは使えますが、string[]はだめです) そもそも、宣言と割り当ての違いはなんですか また、よく 「。。メソッド’****’のオーバーロードはありません」 が出ます これはどういう意味で どう対応すれはいいですか。 入門書等いろいろよみましたが、 実際になるとわからないことが多いす。 よろしくお願いします。

  • c# デリゲート関連の命名について

     こんにちは。c#初心者です。  今回はデリゲート関連の命名についての質問です。 // ――――――――――――――――――――――――――――――― // 簡素化のため、フィールド変数のまま書いています public delegate int SampleDelegate(); public SampleDelegate SampleAction; public int Value {   get { return SampleAction(); } } // ―――――――――――――――――――――――――――――――  上記のようなコードを書いているのですが、「SampleDelegate」に当たる部分、「SampleAction」にあたる部分にはどのような名前をつければいいのかと迷っています。  SampleDelegateは値を取得するメソッドを表すので「GettingValue」や、「ValueGetter」がいいのか、それとも「ValuePasser」みたいなのがいいのか、それ以外がいいのか、  SampleActionも「ValueGetter」がいいのかそれとも、メソッドと同じように「GetValue」にするのがいいのかそれ以外がいいのかと悩んでいます。  最初は「SampleDelegate」が「GettingValue」、「SampleAction」が「ValueGetter」になっているのですが、反対の方がいいような気がしたり、その他いろいろで困っています。  どなたか詳しい方いらっしゃいましたら教えていただけませんか? できれば「『SampleAction』は動作自体だからGettingValueのように『~すること』 のように動名詞を使い方がいい」のように他の命名においても応用が利く教え方にしていただけるとありがたいです。

  • C# コンストラクタ オーバーロード

    今C#を勉強しているのですが、よくコンストラクタがわかりません。初期化をする、というのは理解できるのですが、オーバーロードの際、 int get; string get2;    Person(int a )   { get=a; get2="ああ" } Person(int b,string a)   { get=b; get2=a } show() { Console.WriteLine("{0}{1}"get,get2); } メインメソッド Person p1 = new Person( 1); Person p2 = new Person(2,"あ"); p1.show(); p2.show(); こうすると出力結果が 1ああ 2あ になるはずですが、(わかりずらいですが、)自分の中ではnew演算子が呼ばれたときにが呼ばれて、変数に値が入ります。そして次のnew演算子でが呼ばれて値が上書きされるので2あ 2あ になると思うのですが。それともp1.show();の時点でもう一回コンストラクタが呼ばれているのでしょうか。要は上書きされるのか、showの時にコンストラクタが呼ばれ、その値で出力されるのか、です。

  • C# mdb レコード追加

    お世話になります。 C#の超初心者です。よろしくお願いします。 開発環境 Microsoft Visual C# 2005 mdbはaccess2000です。 現在、C#を使用してmdbに追加を行おうとしていますが、出来ません。 データテーブルまでは、追加は確認されたのですが、 その後updateメソッドを使用して追加を試みているですがエラーが返ってきます。 アダプターオブジェクトは、データセットのアダプターを使用しています。自動で作成される物です。 データセット.xsd内に作成されています。 内容は、 データアダプター名.Update(データセット名,データテーブル名);です。 これを実行すると、 『引数を2個指定できるメソッドUpdateのオーバーロードではありません。』 のエラーがでます。 参考書等見ているのですが、皆目検討もつかない状態です。 分かりづらい質問で大変恐縮ですが、何卒よろしくお願い致します。

  • c# 要素と値

     こんにちは、c#初心者です。  細かいことなんですが、気にしだしたら止まらなくなって、遂に質問です。  配列などで、そのインデックスの位置に含まれているオブジェクトは”値”と呼ばれているところを見かけるのですが、List<T>などのコレクションでは”要素”と呼ばれているのを見かけます。  例えば、Array.IndexOfメソッドでは、XMLに「値を検索します」と書かれている上に、「T value」と値であることが明記してあります。  一方、List<T>のIndexOfメソッドでは、”要素”と書かれていて、「T item」となっています。  「配列の中身は値(value)、コレクションの中身は要素(item)と区別しているのか」と納得しかけていた矢先、Array.Exists 「指定された配列に、……”要素”が……」と配列でも要素という単語が使用されているじゃないですか!  もう訳が分かりません。確かに、値と要素なら大して意味の違いはないので読み手には問題ないですが、書き手にとってはどう使い分ければよいのかちんぷんかんぷんです。  どなたか使い分けの分かる人がいらっしゃいましたら教えていただけませんか?

  • c# この高速化の方法あり? 2

     こんにちは、c#初心者です。  現在ライブラリを作成しているのですが、その中でちょっと問題がありそうな高速化の方法を思いついたので質問させていただきました。  継承させるクラスを作るときに、継承予定のクラスで実装するメソッドやメンバを、基のクラスでは public class Class1 {   internal virtual void Method()   {     throw new NotImplementedException();   } } // - - - - - - - - - - - - - - - - - - - - - - - - - public class Class2 {   internal override void Method()   {     //ここで実装   } } として、 このオブジェクト「sampleObj」があったとして、 if ( sampleObj is Class2 )   sampleObj.Method(); のようにすることで Class2 temp = sampleObj as Class2; if ( temp != null )   temp.Method(); や if ( sampleObj is Class2 )   ((Class2)sampleObj).Method(); のようにすることよりも若干高速になるようです。  末端のアプリケーションならまだ問題になりにくいかもしれませんが、今回はライブラリということなので気になっています。  気休め程度に「internal」になっていますがそれでもまずい気がします。  どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

  • C#で、WinAPIのWNetAddConnection3と同じような機能を実装するには?

    C#でイントラネット内にデータを転送するツールを作っていますが、 ログイン認証がうまくいきません。 WinAPIのWNetAddConnection3メソッドでできるということは 教えていただいたのですが、C#でこれと同様のことをする方法が 解りません。 質問の横投げのような形で大変申し訳ありませんが、ご助力いただ けますよう、お願い申し上げます。

専門家に質問してみよう