2016-05-04 11 views
0

私はprivate List<T>属性のパブリックインターフェイスとして動作するクラスで遊んでいます。私は、List<>クラスに含まれている要素の数を示す属性Lengthがクラスにあることに気付きました。C# - '.Length'のような属性をカスタムクラスに追加

これは変更できない属性です。インテリジェンスには、その横にスパナのイメージが表示されます。それは名前をコード化した後に()を必要としないので、方法ではありません。

私はこれまでこのタイプの属性を見てきましたが、自分のクラスでは使用していませんでした。誰も私のカスタムクラスにLengthをどのように複製できるか考えていますか?

おかげで、 マーク

+2

'List 'には 'Length'ではなく[Count'プロパティ](https://msdn.microsoft.com/en-us/library/27b47ht3(v = vs.110).aspx)があります。しかし、私はあなたが一般的に[プロパティ](https://msdn.microsoft.com/en-gb/library/x9fsa0sw.aspx)を探していると思います。 –

+0

プロパティは、実際にはメソッドによってバッキングされています。 'get_PropertyName'という名前のメソッドが生成されますが、これはあなたの質問とはあまり関係ありません:) –

答えて

4

それは無いセッターを持つプロパティです。

public int Count {get {return _myPrivateList.Count; } }

を使用すると、C#6を使用している場合は、この使用することができます:あなたの場合は

public int Count => _myPrivateList.Count;

1

をあなたはList<T>をラップしている場合、あなたはそれがあなた自身のものとしてカウントします使用することができます現在、Listを含むクラスがある場合は、単にそれを使用するプロパティを公開することによってCountプロパティを利用できます。

public class YourExampleList<T> 
{ 
    // Example of your inner list 
    private List<T> _list { get; set; } 
    // Use the Count property to expose a public "Length" equivalent 
    public int Length { get { return _list.Count; } } 
} 
1

これは実際にはメソッドではなく、プロパティです。

だから、通常のプロパティが今、あなたはあなたのカスタムクラスで独自の実装を作成することができ、そのような

public bool ColumnNames { get; set; } 
1
List<T> myList = new List<T>(); 

として定義されるだろう、あなたのクラスで

private List<string> myList = new List<string>(); 

public int NumberOfElements 
{ 
    get { return this.myList.Count; } 
} 

を定義する可能性があります。ような何か:

public int Length {get {return myList.Count; }} 
1

は、私はあなたの質問は少し曖昧であることを認めなければなりません。あなたは、読み取り専用属性/プロパティを作成する方法を知りたいと思うようです。これは以下のようにクラスのプライベートフィールドメンバのプロパティラッパーを作成することによって達成することができます。

class MyCustomClass 
    { 
     private int _length; 

     public int Length 
     { 
      get { return _length; } 
     } 

    } 
1

セイたとえば、あなたがこのようなクラスを持っている:

public class MyClass 
{ 
    private string _str; 
    public MyClass() 
    { 
     _str = "Sample String"; 
    } 

    public int Length 
    { 
     get 
     { 
      return _str.Length; 
     } 
    } 
} 

これは何が起こっているかです。

  • _strという名前のクラスの先頭にプライベートフィールドを宣言しています。
  • コンストラクタでは、次に"Sample String"という値を割り当てています。
  • コンストラクタの後に、タイプintのpublic属性Lengthを宣言し、アクセッサにgetを与えます。あなたの例のように、これは値を読み取ることができ、設定することはできません。
  • getの中で、_strの長さの値を返すように指示します。

このようなコードを使用すると、任意のカスタムクラスに対してLength属性を実装できます。

関連する問題