在Settings.settings中允许使用Nullable int类型?

时间:2010-09-08 13:07:18

标签: c#

我有一个属性,我想在我的Settings.settings文件中键入int?。当我使用int?时,我遇到运行时故障:

System.NullReferenceException:未将对象引用设置为对象的实例..

我可以使用字符串类型作为解决方法,其中检查null工作,但我必须解析字符串并在解析不起作用时处理错误。

能够将值设置为null允许我将属性保存在设置文件中,同时明确表示没有设置任何值。未设置时,我使用编程的默认值:

int? configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits;
if ( configuredNumberOfLimits == null  )
{
    requiredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS;
}

4 个答案:

答案 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)。 现在,此部分应如下所示(请注意&lt;&gt;用于表示类型字符串中的<>符号 - 这样做是为了正确解析xml由VS):

<Setting Name="RequiredNumberOfLimit" Type="System.Nullable&lt;System.Int32&gt;" 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;
        }
    }