Почему действительно Кэшируется. Добавьте возвращают объект, который представляет кэшируемый элемент?

Dim Result As String
Dim Items As New List(Of String)
Items.Add("Hello")
Items.Add("World")

Result = String.Join(",", Items.ToArray())
MessageBox.Show(Result)

, Если Вы действительно обеспокоены пустыми строками, используйте эту функцию соединения:

Function Join(ByVal delimiter As String, ByVal items As IEnumerable(Of String), Optional ByVal IgnoreEmptyEntries As Boolean = True) As String
    Dim delim As String = ""
    Dim result As New Text.StringBuilder("")

    For Each item As String In items
        If Not IgnoreEmptyEntries OrElse Not String.IsNullOrEmpty(item) Then
            result.Append(delim).Append(item)
            delim = delimiter
        End If
    Next
    Return result.ToString()
End Function
11
задан Pure.Krome 31 May 2010 в 07:08
поделиться

4 ответа

Вызов Add () в кеш-памяти в конечном итоге вызывает внутренний метод с такой сигнатурой:

internal abstract CacheEntry UpdateCache(CacheKey cacheKey, 
    CacheEntry newEntry, bool replace, CacheItemRemovedReason removedReason, 
    out object valueOld);

Обратите внимание на out object valueOld - это значение устанавливается для текущего объекта. в месте "cacheKey" в кэше и возвращается как результат Add (). Документация вводит в заблуждение, это на самом деле не тот же объект , который возвращается - это какой бы объект ни находился в этом том же ключевом месте.

Это легко проверить с помощью следующего кода:

 String x = "lorem";
 String y = "ipsum";

 HttpContext.Current.Cache.Add("hi", x, null, DateTime.MaxValue, 
                               Cache.NoSlidingExpiration, 
                               CacheItemPriority.Normal, null);

 var z = HttpContext.Current.Cache.Add("hi", y, null, DateTime.MaxValue,
                              Cache.NoSlidingExpiration, 
                              CacheItemPriority.Normal, null);

 //Result:
 //   z == "lorem"
12
ответ дан 3 December 2019 в 05:35
поделиться

Если вызов метода Add успешно добавляет элемент, он возвращает null.

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

По логике, он должен возвращать объект, уже находящийся в кеше, поскольку это единственная информация это интересно. У вас уже есть ссылка на объект, который вы пытаетесь поместить в кеш.

2
ответ дан 3 December 2019 в 05:35
поделиться

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

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

Глядя на это в Reflector, оба метода, кажется, вызывают тот же внутренний метод, при этом ADD возвращает старый объект, ранее сохраненный под тем же ключом, а метод INSERT просто игнорирует это значение.

0
ответ дан 3 December 2019 в 05:35
поделиться

Чтобы сделать это еще яснее, вот консольное приложение, которое демонстрирует точное поведение:

static void Main(string[] args)
{
    string key = "key";

    HttpRuntime.Cache.Add(key, "first", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/);
    var addResult = HttpRuntime.Cache.Add(key, "second", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/);

    Console.WriteLine("addResult = {0}", addResult);
    Console.WriteLine("Cache[key] = {0}", HttpRuntime.Cache[key]);
}

И вывод консоли:

addResult = first
Cache[key] = first

«Второй» вызов .Add возвращает то, что в данный момент находится в кэше под нашим ключом, и не может обновить запись!

7
ответ дан 3 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: