gpt4 book ai didi

c# - 从缓存获取对象时,代码试探性无法访问

转载 作者:行者123 更新时间:2023-12-03 03:48:23 26 4
gpt4 key购买 nike

我有以下代码,想法很简单,如果对象在缓存中获取它,如果没有,则从数据源检索它并将其保存到缓存中,我正在使用 resharper 并且收到此警告,但无法理解为什么

 public static ModulosPorUsuario GetModulesForUser(string identityname)
{
// It needs to be cached for every user because every user can have different modules enabled.
var cachekeyname = "ApplicationModulesPerUser|" + identityname;

var cache = CacheConnectionHelper.Connection.GetDatabase();
ModulosPorUsuario modulosUsuario;

//get object from cache
string modulosUsuariosString = cache.StringGet(cachekeyname);

// ReSharper disable once ConditionIsAlwaysTrueOrFalse
if (modulosUsuariosString != null)
{
//conver string to our object
modulosUsuario = JsonConvert.DeserializeObject<ModulosPorUsuario>(modulosUsuariosString);
return modulosUsuario;
}
// ReSharper disable once HeuristicUnreachableCode
modulosUsuario = DbApp.ModulosPorUsuario.Where(p => p.Email == identityname).FirstOrDefault();

//convert object to json string
modulosUsuariosString = JsonConvert.SerializeObject(modulosUsuario);

//save string in cache
cache.StringSet(cachekeyname, modulosUsuariosString, TimeSpan.FromMinutes(SettingsHelper.CacheModuleNames));
return modulosUsuario;
}

最佳答案

这里发生了很多事情,但最重要的是,这是一个 ReSharper 错误 - 该值肯定可以为 null,并且我有一个更小的示例来证明这一点。

首先,让我们弄清楚代码中发生了什么。我必须深入研究一下 StackExchange.Redis您正在使用的库。您的 cache 对象实际上是一个 IDatabase,它是由 RedisDatabase 实现的。类(class)。 StringGet您使用的方法返回一个 RedisValue,它是一个结构。这本身就完全可以解释为什么 ReSharper 告诉您它永远不能为 null - 值类型不能!

但是,您将结果放入字符串变量中!这是有效的,因为 RedisValue 结构定义了一堆 implicit operators将值转换为请求的类型。如果是字符串,请注意如果 blob 为空,则返回空字符串:

RedisValue.cs

/// <summary>
/// Converts the value to a String
/// </summary>
public static implicit operator string(RedisValue value)
{
var valueBlob = value.valueBlob;
if (valueBlob == IntegerSentinel)
return Format.ToString(value.valueInt64);
if (valueBlob == null) return null;

if (valueBlob.Length == 0) return "";
try
{
return Encoding.UTF8.GetString(valueBlob);
}
catch
{
return BitConverter.ToString(valueBlob);
}
}

但从这段代码可以明显看出,该字符串也可以为 null

这使得 ReSharper 无法正确标记该行,并且可以使用较小的示例来重现它:

static void Main(string[] args)
{
string value = MyStruct.GetValue();
if (value == null) // <- ReSharper complains here, but the value is null!
{
return;
}
}

public struct MyStruct
{
public static MyStruct GetValue() => new MyStruct();

public static implicit operator string(MyStruct s)
{
return null;
}
}

reported将此问题提交给 JetBrains,他们会修复它。

与此同时,您可能希望保留该评论,禁用 ReSharper 警告。

关于c# - 从缓存获取对象时,代码试探性无法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com