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

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

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

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

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

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

我认为你最好的选择是成为一个老式的bool / int组合。 它不是最漂亮的解决方案,但它与int?无法真正区别开来int?

 int configuredNumberOfLimits; if (Settings.Default.HasRequiredNumberOfLimits) { configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits; } else { configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; } 

有一种方法可以使用nullable类型(即int? )进行设置 – 它需要对设置文件进行一些手动编辑,但之后在VS环境和代码中都可以正常工作。 并且不需要额外的function或包装。

为此,请创建具有所需名称的设置(例如, RequiredNumberOfLimit )并使其成为任何类型(例如,为方便起见,使用标准int )。 保存更改。

现在转到项目文件夹并使用文本编辑器打开“Properties \ Settings.settings”文件(例如,记事本)或者您可以通过右键单击解决方案资源管理器中的“<您的项目> – >属性 – 在VS中打开它”。 > Settings.settings“,选择”打开方式…“,然后选择”XML编辑器“或”源代码(文本)编辑器“。 在打开的xml设置中找到您的设置(它将如下所示):

  0  

System.Int32的“Type”参数更改为System.Nullable 。 并且还清除默认值(因此默认情况下可以使用null)。 现在这个部分应该是这样的(注意<>用于表示类型字符串中的<>符号 - 这是为了正确解析VS的xml):

    

现在保存更改并重新打开项目设置 - 瞧! - 我们的设置RequiredNumberOfLimit的类型为System.Nullable ,它由VS Settings Designer正确解析,并且它可以用作普通的int? 代码中的变量。

如果您希望此设置能够返回null ,则应保持默认值字段清除。 否则,如果先前已将此值设置为null,则此设置将返回默认值(但这就是默认值的工作原理,不是吗?:P)。

关于什么:

 int configuredNumberOfLimits if(!int.TryParse(Settings.Default.RequiredNumberOfLimits, out configuredNumberOfLimits)) { configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; } 

这样您就可以检查该值,如果失败则设置默认值。 不用担心字符串或解析或未处理的exception。

您可以在Settings.Designer.cs中手动设置类型

例如:

  public decimal? Test{ get { return ((decimal?)(this["Test"])); } set { this["Test"] = value; } }