Типы кэшируемых значений c # - PullRequest
3 голосов
/ 02 апреля 2012

Я разрабатываю кэш для универсальных типов и сомневаюсь, стоит ли мне кэшировать типы значений, такие как int, struct и т. Д. Кэш часто используется для хранения дорогостоящих объектов, а типы значений очень дешевы в создании. Ограничение элементов, которые могут быть вставлены в кэш ссылочными типами, облегчит реализацию кода. Разрешить кэшировать только ссылочные типы?

При удалении типов valur из кеша стоит подумать: кеш может автоматически загружать значения через делегата, и этот делегат никогда не должен возвращать ноль. Поскольку типы значений нельзя сравнивать с нулем, и значение defaut (T) может быть допустимым типом значения. Как я могу проверить, возвращает ли предоставленный пользователем делегат правильное значение (при условии, что исключение не было вызвано)?

Ответы [ 6 ]

7 голосов
/ 02 апреля 2012

Кэш должен использоваться всякий раз, когда генерируется значение чего-либо, что занимает много времени. Например, для вычисления Ответа на главный вопрос жизни, Вселенной и всего * требуется огромный суперкомпьютер 7,5 миллионов лет, но для его хранения требуется всего int. Это вычисление все еще очень вероятно выиграет от кеширования, если другой пользователь запросит ответ на главный вопрос жизни, Вселенной и всего.

5 голосов
/ 02 апреля 2012

Ну, концептуально вы не кешируете значение.Вы кешируете результат вычисления.Вы говорите не «Эй, Кэш, дай мне число 4!», А скорее «Эй, Кэш, дай мне население Небраски 6 января 1932 года», которое должно вернуть int, но это int может быть трудно вычислить.

1 голос
/ 02 апреля 2012

Обычно определение для кэширования должно основываться на затратах на получение данных, частоте их изменения и частоте использования, а не на типе данных.

Например, если это занимает 5 секундвычислить одно целое число, а затем кэшировать это значение.Для сравнения, может быть дешевым извлечение таблицы данных из базы данных каждый раз, когда вам это нужно, и это не стоит усилий / памяти для ее кэширования.

0 голосов
/ 02 апреля 2012

Что касается вашего редактирования: вы предполагаете ложь.Необнуляемые типы значений можно сравнивать с нулем;результат сравнения всегда ложен.Обратите внимание:

bool IsItNull<T>(T value)
{
    return value == null;
}

Console.WriteLine(IsItNull(new object())); // False
Console.WriteLine((string)null); // True
Console.WriteLine(5); // False

Сравнение типов значений с нулем не ограничивается общими методами:

http://ideone.com/c74Tc

Если ваши требования к проверке более сложные, вы можете принятьФункция проверки вместе с делегатом, который вычисляет значение для кэширования:

Func<string> generator = () => GetStringFromDatabase();
Func<string, bool> validator = s => s != null;

Для целого числа, если вы знаете, что значение должно быть неотрицательным:

Func<int> generator = () => GetAnIntFromDatabase();
Func<int, bool> validator = i => i >= 0;
0 голосов
/ 02 апреля 2012

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

    private static void Perform<T>(T input) 
    {
        Console.WriteLine(typeof(T));
    }

    public static void Test<T>(T input) where T : class
    {
        Perform(input);
    }

    public static void Test<T>(T? input) where T : struct
    {
        Perform(input);
    }

    public static void Tester()
    {
        Test((int ?)2);
        Test(new object());
    }
0 голосов
/ 02 апреля 2012

Я предполагаю, что вы пытаетесь cache значение, которое является дорогостоящим для вычисления. Вычисленное значение может быть любым. Это может быть целое число или сложный объект. Вам следует принять решение о кэшировании элемента, если его трудно вычислить, но не о том, если вычисленное значение равно Value type or Reference Type.

Если приложение предназначено для .net 3.5 или выше, Вот хорошая отправная точка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...