简体   繁体   中英

Can I make a read-only indexer in C#?

In this SO question , we see how to create an indexer for a class. Is it possible to create a read-only indexer for a class?

Here is the Indexer example provided by Microsoft:

using System;

class SampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr = new T[100];

   // Define the indexer to allow client code to use [] notation.
   public T this[int i]
   {
      get { return arr[i]; }
      set { arr[i] = value; }
   }
}

class Program
{
   static void Main()
   {
      var stringCollection = new SampleCollection<string>();
      stringCollection[0] = "Hello, World";
      Console.WriteLine(stringCollection[0]);
   }
}
// The example displays the following output:
//       Hello, World.

A read-only Indexer can be achieved by not including a set property in the declaration of the Indexer.

To modify the Microsoft example.

using System;

class ReadonlySampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr;

   // Constructor with variable length params.
   public ReadonlySampleCollection(params T[] arr) 
   {
       this.arr = arr;
   }

   // Define the indexer to allow client code to use [] notation.
   public T this[int i]
   {
      get { return arr[i]; }
   }
}

public class Program
{
   public static void Main()
   {
      var stringCollection = new ReadonlySampleCollection<string>("Hello, World");
      Console.WriteLine(stringCollection[0]);
      // stringCollection[0] = "Other world"; <<<< compiler error.
   }
}
// The example displays the following output:
//       Hello, World.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM