如何使用带有可空值的吸气剂?

Posted

技术标签:

【中文标题】如何使用带有可空值的吸气剂?【英文标题】:How to use a getter with a nullable? 【发布时间】:2013-11-23 22:55:20 【问题描述】:

我正在从数据库中读取一堆查询。我遇到了查询未关闭的问题,因此我添加了 CommandTimeout。现在,每次运行时,各个查询都会从配置文件中读取。 如何使用静态可空值和吸气剂使代码仅从配置文件中缓存一次 int。 我正在考虑按照以下方式做一些事情:

static int? var;
get var = null;
    if (var.HasValue)
    ...(i dont know how to complete the rest)

我的实际代码:

private object QueryMethod(string item)

    using (SqlConnection connection = new SqlConnection(item))
    
        connection.Open();

        using (SqlCommand sql = new SqlCommand())
        
            AddSQLParms(sql);
            sql.CommandTimeout = 30;
            sql.CommandText = _cmdText;
            sql.Connection = connection;
            sql.CommandType = System.Data.CommandType.Text;

            sql.ExecuteNonQuery();
        
        connection.Close();
    
    return false;

【问题讨论】:

is this necessary since.... 我不明白那个评论。不,没必要。 您还应该检查 DBNull。 @terrybozzio - 不正确。 ExecuteNonQuery 不返回 DBNull。只有值或null @TimSchmelter 抱歉,我忘了删除那行代码。 【参考方案1】:

第一:别叫var

我们称之为cached_value

static int? cached_value;

get  return cached_value ?? cached_value = your_logic_here 

这样,第一次调用时,如果为null,它会初始化字段。下次调用 getter 时,您将获得所需的值。

【讨论】:

欢迎您...选择您喜欢的答案,如果您认为自己得到了答案,请将其标记为已回答:) 我对一件事有点困惑,这将放在我的代码块中的什么位置? 我猜想与您的查询相同的类(因此它可以访问它)。【参考方案2】:

您可以使用Lazy<T> 类尝试这样的事情:

public static class ConfigCache

    private static Lazy<int> connectionTimeout =
        new Lazy<int>(() => int.Parse(
            ConfigurationManager.AppSettings["connectionTimeout"]));

    public static int ConnectionTimeout
    
        get  return connectionTimeout.Value; 
    

用法:

sqlCmd.CommandTimeout = ConfigCache.ConnectionTimeout;

【讨论】:

【参考方案3】:

var 是系统关键字 - 不要使用它

V1 - 在这个版本中你希望 config 有一个值,否则会发生错误

static int? _timeout = null;

private static int GetTimeout()

    if (_timeout != null) return (int)_timeout;
    _timeout = GetTimeoutFromConfig();
    return (int)_timeout;

V2 - 在这个版本中,如果配置为空,您将使用默认值

static int? _timeout = null;
private const int def_timeout = 120;   

private static int GetTimeout()

    if (_timeout != null) return (int)_timeout;
    int? to = GetTimeoutFromConfig();
    _timeout = (to ?? def_timeout); 

    return (int)_timeout;

从配置转换

private int? GetTimeoutFromConfig()

    int val;
    bool converted = int.TryParse(ConfigurationManager.AppSettings["TimeoutValue"], out val);

    return (converted ? val : null);
 

【讨论】:

打开IL反编译器看看 假设他的逻辑返回一个int,他应该没问题:) 如何使用您的代码格式覆盖配置文件中没有超时的情况? 命令有默认超时。如果您担心命令的超时不是您需要的,那么您可以添加您的默认值:static int _timeout = 120; 然后您将检查配置值是否为空 - 忽略它。 这是当前发生的情况,当我将配置值留空“”时,我收到此错误:“输入字符串不正确格式”。顺便说一句,我会投票给你的帖子有帮助,但我还没有足够的声誉。【参考方案4】:

听起来你在问如何使用 Nullable 变量。

static int? val;
get 
    if (var.HasValue)
    
      return val.Value;
    
    else 
       val = GetValFromConfig();
       return val.Value;
    
 

var 是 C# 中的关键字

【讨论】:

该死的......你打败了我 只有喜欢 ... 7 分钟 :) 你没有找到他们?? 语法清洁器吗? 'val' 后面应该有分号吗?并且在获取之前不应该有括号,最后应该有一个右括号还是我错过了什么? 这些都在那里。你没看到吗?

以上是关于如何使用带有可空值的吸气剂?的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net:如何从隐式所有公共字段的波尔图合同中排除只读属性(只有吸气剂)?

Android Studio:房间:错误:找不到字段的吸气剂

了解 Nuxt.js 中的状态和吸气剂:吸气剂不起作用

Flutter:没有为“RetryOptions”类定义吸气剂“Pestawait”

c# 2.0 中可空值的默认值

c++11 - 所有权和吸气剂