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

引数があるプロパティの取得

環境/言語:[WindowXP、C#]
分類:[.NET]

[VB.NETコード]
Private A() As String
Public Property Data(ByVal B As Integer) As String
Get
Return A(B)
End Get
End Property

をC#で実現するにはどのようなコードを書けばよろしいでしょうか?
自信はありません。

インデクサで調べてみると幸せになれると思われます。

http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_012/cs2_012_01.html

# VB.NETで引数があるプロパティを作った事が無いので、
# C#だったらインデクサだろうなぁ〜という回答です。
■No22478に返信(shimさんの記事)
> [VB.NETコード]
このコードは、ReadOnly プロパティですか?


> をC#で実現するにはどのようなコードを書けばよろしいでしょうか?
C# の言語仕様では、引数付きプロパティがサポートされていないので、
以下のいずれかで対応してみてください。

// インデクサで代用する。
[IndexerName("Data")] public string this[int b] { get { return a[b]; } }

// get/setのメソッドに切り替える。
public string get_Data(int b) { return a[b]; }
■No22478に返信(shimさんの記事)
> Public Property Data(ByVal B As Integer) As String
> をC#で実現するにはどのようなコードを書けばよろしいでしょうか?

私がよくやるのは,中間的なコレクションクラスを用意する方法です。
そいつがインデクサを持つことによって,名前付きプロパティを擬似的に実装することができます。
これをやると,そもそもデータをどちらが持つのか,という問題が出てきたりはしますが……。
public class Foo
{
  private string[] _data;

  public class StringCollection // 中間コレクション。IEnumerableなどは好みによって。
  {
    private readonly Foo _foo; // コレクションの持ち主

    internal StringCollection (Foo foo)
    {
      _foo = foo;
    }

    public int Count
    {
      get
      {
        return _foo._data.Length;
      }
    }

    public string this [int index]
    {
      get
      {
        return _foo._data[index];
      }
    }
  }

  public StringCollection Data
  {
    get
    {
      return new StringCollection(this); // 毎回作るのはコストがかかるので,別に用意したいところ。
    }
  }
}
じゅでさん、魔界の仮面弁士さん、YuOさん

C#で引数付きプロパティがサポートされていないことを知りませんでした。
まずはインデクサの勉強からしてみたいと思います。

お忙しいところご回答頂きましてありがとうございます。
解決済み!

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