4

私はかなり長い間VisualBasicを使用してきましたが、最近、より複雑な言語の学習への一歩としてC#の学習を開始することを決定しました。

このジャンプの一環として、古いVBプロジェクトのいくつかを手動でC#に変換することにしました。私が抱えている問題は、引数/インデックスを持つプロパティを使用してクラスを持つライブラリを変換することです。

プロパティは、VBでは次のようになります。

Friend Property Aproperty(ByVal Index As Integer) As AClass
        Get
            Return Alist.Item(Index)
        End Get
        Set(ByVal value As KeyClass)
            Alist.Item(Index) = value
        End Set
    End Property

プロパティを使用すると、次のように使用されます。

Bclass.Aproperty(5) = new AClass

これは私がC#で達成したいこの種のことですが、C#はこの種のことを実行できないように見えるため、これを実行する方法を私の人生で理解することはできません。

4

3 に答える 3

4

C#はパラメーター化されたプロパティ(表示しているもの)をサポートしていないため、このコードをGetAProperty(index)とSetAProperty(index)の2つの関数に変換する必要があります。

50,000以上のLOCアプリケーションをVBからC#に変換しましたが、パラメーター化されたプロパティに依存しているため、このような大幅な変更が必要でした。ただし、それは実行可能であり、このようなプロパティについて別の考え方が必要なだけです。

于 2012-07-29T18:49:54.877 に答える
4

インデクサーを使用すると、クラスまたは構造体のインスタンスに配列と同じようにインデックスを付けることができます。インデクサーは、アクセサーがパラメーターを受け取ることを除いて、プロパティに似ています。

http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

インデクサーは、次のthisようなキーワードを使用して定義されます。

public T this[int i]
{
    get
    {
        // This indexer is very simple, and just returns or sets
        // the corresponding element from the internal array.
        return arr[i];
    }
    set
    {
        arr[i] = value;
    }
}

.NETクラスライブラリの設計ガイドラインでは、クラスごとに1つのインデクサーのみを使用することを推奨しています。

インデックスパラメータタイプに基づいてインデクサーをオーバーロードできます

public int this[int i]
public string this[string s]

ただし、戻り値には基づいていません

// NOT valid
public int this[int i]
public string this[int i]
于 2012-07-29T18:05:58.217 に答える
1

インデックス付けでのみアクセス可能なプロパティを指定できるとは思いませんが、インデックス付け可能な値(配列やList)を返し[]、結果に使用することはできます。

public List<Aclass> Aproperty
{
    get 
    {
         return this.theList;
    }
}

Aclass foo = this.Apropety[0];

もちろん、の代わりにインデクサーを使用するものはすべて機能しListます。

Apropertyまたは、逆の方法で行うこともできます。次のように使用される、プロパティを持つオブジェクトを返すインデクサーを(クラス自体に)定義しますAclass foo = this[0].Aproperty

于 2012-07-29T18:42:35.557 に答える