Реальные примеры использования для индексаторов C #? - PullRequest
44 голосов
/ 02 февраля 2010

Я видел много примеров для индексаторов c #, но каким образом это поможет мне в реальных ситуациях.

Я знаю, что гуру C # не добавил бы это, если бы неСерьезная особенность, но я не могу придумать реальную ситуацию в мире (не то, что касается бара foo), чтобы использовать индексаторы.

Примечание.мне очень.

Ответы [ 14 ]

0 голосов
/ 01 ноября 2016

Вы можете использовать индексатор, чтобы элегантно обеспечить многопоточную синхронизацию чтения / записи в словарь, не поддерживающий потоки (или любую коллекцию, не поддерживающую поток):

internal class ThreadSafeIndexerClass
{
    public object this[int key]
    {
        get
        {
            // Aquire returns IDisposable and does Enter() Exit() on a certain ReaderWriterLockSlim instance
            using (_readLock.Aquire()) 
            {
                object subset;
                _dictionary.TryGetValue(key, out foundValue);
                return foundValue;
            }
        }
        set
        {
            // Aquire returns IDisposable and does Enter() Exit() on a certain ReaderWriterLockSlim instance
            using (_writeLock.Aquire())
                _dictionary[key] = value;
        }
    }
}

Полезно, особенно если вы не хотите использовать тяжеловесный ConcurrentDictionary (или любую другую одновременную коллекцию).

0 голосов
/ 05 августа 2014

Я пытаюсь получить изображения из файла последовательности. Мне нужен какой-то 2D-массив или неровный массив для хранения значений пикселей. Я использую индексаторы вместо массивов, потому что зацикливание по индексаторам быстрее, чем зацикливание по двумерным или зубчатым массивам.

0 голосов
/ 11 октября 2012

Добавление к @ code-kings post.

Более того, вызов RollNumberVariable[0] вызовет поведение индексатора коллекции по умолчанию.Хотя индексаторы на самом деле являются свойствами , вы можете писать собственную логику при извлечении данных.Вы можете легко делегировать большую часть значения параметра индекса во внутреннюю коллекцию, но вы также можете вернуть любое произвольное значение для определенных значений индекса.

Просто пример - вы можете иметь 2+ внутренних коллекции в другом формате, новнешний пользователь будет взаимодействовать с ними через один индексатор (который будет работать как диспетчер), в то время как эта коллекция будет скрыта.Это в значительной степени поощряет принцип инкапсуляции.

0 голосов
/ 11 октября 2012

http://code -kings.blogspot.in / 2012/09 / индексаторах-в-с-5.html

с использованием системы;

пространство имен Indexers_Example

{

class Indexers
{

    private Int16[] RollNumberVariable;

    public Indexers(Int16 size)
    {
        RollNumberVariable = new Int16[size];

        for (int i = 0; i < size; i++)
        {
            RollNumberVariable[i] = 0;
        }
    }

    public Int16 this[int pos]
    {
        get
        {
            return RollNumberVariable[pos];
        }
        set
        {
            RollNumberVariable[pos] = value;
        }
    }
}

}

...