我有一个属性,我想在我的Settings.settings文件中键入int?
。当我使用int?
时,我遇到运行时故障:
System.NullReferenceException:未将对象引用设置为对象的实例..
我可以使用字符串类型作为解决方法,其中检查null工作,但我必须解析字符串并在解析不起作用时处理错误。
能够将值设置为null允许我将属性保存在设置文件中,同时明确表示没有设置任何值。未设置时,我使用编程的默认值:
int? configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits;
if ( configuredNumberOfLimits == null )
{
requiredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS;
}
答案 0 :(得分:56)
有一种方法可以使用可空类型(即int?
)进行设置 - 它需要对设置文件进行一些手动编辑,但之后在VS环境和代码中工作正常。并且不需要额外的功能或包装。
要执行此操作,请创建具有所需名称的设置(例如 RequiredNumberOfLimit )并将其设置为任何类型(例如标准int
以方便起见)。
保存更改。
现在转到项目文件夹并使用文本编辑器打开“Properties \ Settings.settings”文件(例如,记事本)或者您可以通过右键单击“< Your Project>上的解决方案资源管理器在VS中打开它。 - >属性 - > Settings.settings“,选择”打开方式...“,然后选择”XML编辑器“或”源代码(文本)编辑器“。 在打开的xml设置中找到您的设置(它将如下所示):
<Setting Name="RequiredNumberOfLimit" Type="System.Int32" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
将“类型”参数从System.Int32
更改为System.Nullable<System.Int32>
。并且还清除默认值(因此默认情况下可以使用null)。
现在,此部分应如下所示(请注意<
和>
用于表示类型字符串中的<
和>
符号 - 这样做是为了正确解析xml由VS):
<Setting Name="RequiredNumberOfLimit" Type="System.Nullable<System.Int32>" Scope="User">
<Value Profile="(Default)" />
</Setting>
现在保存更改并重新打开项目设置 - 瞧! - 我们的设置 RequiredNumberOfLimit 的类型为System.Nullable<System.Int32>
,VS Settings Designer正确解析了它,并且它可以在代码中用作普通的int?
变量。 / p>
如果您希望此设置能够返回null
,则应保持默认值字段清除。
否则,如果之前已将该值设置为null,则此设置将返回默认值(但这就是默认值的工作原理,不是吗?:P)。
答案 1 :(得分:3)
怎么样:
int configuredNumberOfLimits
if(!int.TryParse(Settings.Default.RequiredNumberOfLimits,
out configuredNumberOfLimits))
{
configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS;
}
这样您可以检查值,如果失败则设置默认值。不用担心字符串或解析或未处理的异常。
答案 2 :(得分:2)
我认为你最好的选择是成为一个老式的bool
/ int
组合。它不是最漂亮的解决方案,但并不是 与int?
不同。
int configuredNumberOfLimits;
if (Settings.Default.HasRequiredNumberOfLimits)
{
configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits;
}
else
{
configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS;
}
答案 3 :(得分:1)
您可以在Settings.Designer.cs中手动设置类型
例如:
public decimal? Test{
get {
return ((decimal?)(this["Test"]));
}
set {
this["Test"] = value;
}
}