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