如何使用带有可空值的吸气剂?
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:房间:错误:找不到字段的吸气剂