C# 返回任务的默认值或null<;T>;
我在缓存库周围有一个包装器,并使用以下方法基于键检索缓存值:C# 返回任务的默认值或null<;T>;,c#,async-await,C#,Async Await,我在缓存库周围有一个包装器,并使用以下方法基于键检索缓存值: public async Task<T> GetAsync<T>(string key) { var serializedObject = await _cache.GetStringAsync(key); return JsonConvert.DeserializeObject<T>(serializedObject); } 公共异步任务GetAsync(字符串键) { var
public async Task<T> GetAsync<T>(string key)
{
var serializedObject = await _cache.GetStringAsync(key);
return JsonConvert.DeserializeObject<T>(serializedObject);
}
公共异步任务GetAsync(字符串键)
{
var serializedObject=wait_cache.GetStringAsync(键);
返回JsonConvert.DeserializeObject(serializedObject);
}
问题是缓存中没有任何内容,我从反序列化对象方法接收到一个错误。当缓存中没有存储任何内容时,如何返回null或T的默认值,这让我感到困惑
我试过:
public async Task<T> GetAsync<T>(string key)
{
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) return Task.CompletedTask;
return JsonConvert.DeserializeObject<T>(serializedObject);
}
public async Task<T> GetAsync<T>(string key)
{
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) return Task.FromResult<T>(null);
return JsonConvert.DeserializeObject<T>(serializedObject);
}
公共异步任务GetAsync(字符串键)
{
var serializedObject=wait_cache.GetStringAsync(键);
如果(serializedObject==null)返回Task.CompletedTask;
返回JsonConvert.DeserializeObject(serializedObject);
}
但是Task.CompletedTask无法转换为任务
我试过:
public async Task<T> GetAsync<T>(string key)
{
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) return Task.CompletedTask;
return JsonConvert.DeserializeObject<T>(serializedObject);
}
public async Task<T> GetAsync<T>(string key)
{
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) return Task.FromResult<T>(null);
return JsonConvert.DeserializeObject<T>(serializedObject);
}
公共异步任务GetAsync(字符串键)
{
var serializedObject=wait_cache.GetStringAsync(键);
if(serializedObject==null)返回Task.FromResult(null);
返回JsonConvert.DeserializeObject(serializedObject);
}
但是null不是T的有效参数
如何让GetAsync返回null或T的默认值
更新
我做了以下工作:
public async Task<T> GetAsync<T>(string key)
{
var serializedObject = await _cache.GetStringAsync(key);
return serializedObject == null ? default(T) : JsonConvert.DeserializeObject<T>(serializedObject);
}
公共异步任务GetAsync(字符串键)
{
var serializedObject=wait_cache.GetStringAsync(键);
返回serializedObject==null?默认值(T):JsonConvert.DeserializeObject(serializedObject);
}
您试过这个吗?
返回默认值(T)代码>
因为您正在返回默认值T
,所以您最好同步返回它。您有三个选项:
- 如果不需要支持值类型,请添加
T:class
约束
- 添加一个包装类,让调用者知道访问缓存是否成功,或者
- 添加一个方法,在检索失败时构造并缓存新值
第一个实现允许您的方法编译:
public async Task<T> GetAsync<T>(string key) where T : class {
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) {
return await Task.FromResult<T>(null);
}
return JsonConvert.DeserializeObject<T>(serializedObject);
}
公共异步任务GetAsync(字符串键),其中T:class{
var serializedObject=wait_cache.GetStringAsync(键);
if(serializedObject==null){
返回等待任务.FromResult(空);
}
返回JsonConvert.DeserializeObject(serializedObject);
}
下面是第二个实现:
class CacheResult<T> {
public bool IsSuccess {get;}
public T Value {get;}
public CacheResult(T val, bool isSuccess) {
Value = val;
IsSuccess = isSuccess;
}
}
public async Task<CacheResult<T>> GetAsync<T>(string key) {
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) {
return new CacheResult(default(T), false);
}
return new CacheResult(
JsonConvert.DeserializeObject<T>(serializedObject)
, true
);
}
public async Task<T> GetAsync<T>(string key, Func<string,T> make) {
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) {
var res = make(key);
_cache.PutStringAsync(key, JsonConvert.SerializeObject(res));
return res;
}
return JsonConvert.DeserializeObject<T>(serializedObject);
}
类缓存结果{
公共bool IsSuccess{get;}
公共T值{get;}
公共缓存结果(T val、bool isSuccess){
值=val;
IsSuccess=IsSuccess;
}
}
公共异步任务GetAsync(字符串键){
var serializedObject=wait_cache.GetStringAsync(键);
if(serializedObject==null){
返回新的缓存结果(默认值(T),false);
}
返回新的缓存结果(
JsonConvert.DeserializeObject(serializedObject)
是的
);
}
下面是第三个实现:
class CacheResult<T> {
public bool IsSuccess {get;}
public T Value {get;}
public CacheResult(T val, bool isSuccess) {
Value = val;
IsSuccess = isSuccess;
}
}
public async Task<CacheResult<T>> GetAsync<T>(string key) {
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) {
return new CacheResult(default(T), false);
}
return new CacheResult(
JsonConvert.DeserializeObject<T>(serializedObject)
, true
);
}
public async Task<T> GetAsync<T>(string key, Func<string,T> make) {
var serializedObject = await _cache.GetStringAsync(key);
if (serializedObject == null) {
var res = make(key);
_cache.PutStringAsync(key, JsonConvert.SerializeObject(res));
return res;
}
return JsonConvert.DeserializeObject<T>(serializedObject);
}
public async Task GetAsync(字符串键,Func make){
var serializedObject=wait_cache.GetStringAsync(键);
if(serializedObject==null){
var res=制造(关键);
_PutStringAsync(key,JsonConvert.SerializeObject(res));
返回res;
}
返回JsonConvert.DeserializeObject(serializedObject);
}
调用方需要向第二个方法提供“工厂”委托,以便在缓存对象不可用时创建新对象。返回null代码>/返回默认值(T)代码>?不,null也不起作用。t
上的类型约束是什么?您不需要等待任务。FromResult
返回默认值(t)代码>或返回等待任务.FromResult(默认值(T))如果两者都能工作,第一个选项就是better@BrunoLM是的,同步返回默认值T
似乎更有意义:)有趣的方法,这对返回默认值(T)有好处吗?@Josh Yes,当一个键恰好映射到一个default(T)
值时,它让调用者决定是否有一个缓存值:例如,如果T
是一个int
,这种方法让你决定key
是否映射到零而不是该键没有值。具有所有默认值的struct
s也是如此。