如何使用具有可为空值的 getter



我正在从数据库中读取一堆查询。我遇到了查询未关闭的问题,因此我添加了命令超时。现在,各个查询每次运行时都会从配置文件中读取。我将如何使用静态可为空值和 getter 使代码仅从配置文件缓存一次 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;
}

首先:不要称它为var

我们称之为cached_value.

static int? cached_value;
get { return cached_value ?? cached_value = your_logic_here }

这样,第一次调用它时,如果它为 null,它将初始化字段。下次你打电话给getter时,你只会得到你需要的值。

您可以使用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;
var是一个

系统关键字 - 不要使用它

V1 - 在此版本中,您希望配置具有值,否则会发生错误

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);
} 

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

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

var 是 C# 中的一个关键字

相关内容

  • 没有找到相关文章

最新更新