Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回任务的默认值或null<;T>;_C#_Async Await - Fatal编程技术网

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))T
似乎更有意义:)有趣的方法,这对返回默认值(T)有好处吗?@Josh Yes,当一个键恰好映射到一个
default(T)
值时,它让调用者决定是否有一个缓存值:例如,如果
T
是一个
int
,这种方法让你决定
key
是否映射到零而不是该键没有值。具有所有默认值的
struct
s也是如此。