2010-09-08 2 views
21

J'ai une propriété que je voudrais taper int? dans mon fichier Settings.settings. Quand j'utilise int? je reçois une erreur d'exécution:Type int null autorisé dans Settings.settings?

System.NullReferenceException: référence d'objet non définie à une instance d'un objet ..

Je peux utiliser un type de chaîne comme une solution de contournement lorsqu'une vérification des travaux nuls, mais je dois analyser la chaîne et gérer les erreurs lorsque l'analyse ne fonctionne pas. Etre capable de définir la valeur à null me permet de conserver la propriété documentée dans le fichier de paramètres tout en rendant évident qu'aucune valeur n'a été définie. En cas de non je plaçai utilise une valeur par défaut programmée:

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

Utilisez var au lieu? – Gage

+1

@Gage: Je pense que cela manque le point. Il veut que le paramètre * défini * soit un int? –

Répondre

2

Je pense que votre meilleur pari va être une ancienne combo bool/int. Ce n'est pas la plus belle solution, mais ce n'est pas vraiment différent d'un int?.

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

Merci. Depuis int? n'est pas un type supporté dans Settings.settings mon choix semble être entre ce que vous avez suggéré et ce que suggère @Kevin. – Don

+0

@Martin: Oui, à peu près;) –

3

Qu'en est-:

int configuredNumberOfLimits 

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

De cette façon, vous pouvez vérifier la valeur, et si elle échoue, vous définissez la valeur par défaut. Ne vous inquiétez pas des chaînes ou de l'analyse, ou des exceptions non gérées.

+0

C'est la solution de contournement que j'ai mentionné. Je voudrais éviter l'analyse si possible. – Don

+0

Je n'ai pas essayé cela, mais avez-vous essayé int? value = Paramètres ... as (int) – kemiller2002

52

Il existe un moyen d'utiliser le type Nullable (par exemple, int?) pour un paramètre - il nécessite un peu d'édition manuelle du fichier de paramètres, mais fonctionne ensuite correctement dans l'environnement VS et dans le code. Et ne nécessite pas de fonctions supplémentaires ou des wrappers.

Pour ce faire, créez un paramètre avec le nom souhaité (par exemple RequiredNumberOfLimit) et en font de tout type (par exemple la norme int pour plus de commodité). Enregistrez les modifications.

Maintenant allez dans votre dossier de projet et ouvrez le fichier "Properties \ Settings.settings" avec l'éditeur de texte (Notepad, par exemple) Ou vous pouvez l'ouvrir dans VS en cliquant-droit dans l'Explorateur de solutions sur "< Your Project -> Propriétés -> Settings.settings ", sélectionnez" Ouvrir avec ... ", puis choisissez" Éditeur XML "ou" Éditeur de code source (texte) ". Dans les paramètres xml ouverts à trouver votre établissement (il ressemblera à ceci):

<Setting Name="RequiredNumberOfLimit" Type="System.Int32" Scope="User"> 
    <Value Profile="(Default)">0</Value> 
</Setting> 

Changer le PARAM « Type » System.Int32-System.Nullable<System.Int32>. Et efface également la valeur par défaut (donc null pourrait être utilisé par défaut). Maintenant, cette section devrait ressembler à ceci (notez que &lt; et &gt; sont utilisés pour représenter < et > symboles dans la chaîne de type - ceci est fait pour l'analyse correcte de xml par VS):

<Setting Name="RequiredNumberOfLimit" Type="System.Nullable&lt;System.Int32&gt;" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

maintenant enregistrer les modifications et rouvrir les paramètres du projet - voilà! - nous avons le paramètre RequiredNumberOfLimit avec le type System.Nullable<System.Int32> qui est analysé correctement par VS Settings Designer, ainsi qu'il pourrait être utilisé comme une variable normale int? dans le code.

Si vous souhaitez que ce paramètre puisse renvoyer null, vous devez conserver le champ de valeur par défaut. Sinon, la valeur par défaut sera retournée par ce paramètre si elle a déjà été affectée à null (mais c'est comment les valeurs par défaut fonctionnent, n'est-ce pas?: P).

+0

Cool !! Fonctionne comme un charme! –

+4

L'approche a fonctionné pour afficher le paramètre dans le concepteur Paramètres et pour définir la valeur par défaut dans le code. Cependant, mon paramètre a disparu du fichier App.config lorsque j'ai effectué cette modification. Cela peut ou peut ne pas être important dans un contexte donné, mais je pensais que cela valait la peine d'être noté. – Brian

+1

Pour ajouter à ce que @Brian a dit: oui, éditer avec le concepteur de paramètres effacera les paramètres de app.config, mais si vous les remettez, ils sont lus à partir de là. Donc, soit ne pas utiliser le concepteur, soit n'oubliez pas de remettre les réglages après l'avoir utilisé ... un peu pénible, mais dans mon cas je pense que ça vaut le coup. – Paul

1

Vous pouvez taper RG.MANUEL dans Settings.Designer.cs

Par exemple:

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

Le problème avec ceci est que chaque fois que vous apportez une modification à l'onglet Paramètres, vous devrez retourner dans le designer.cs et changer le type à nouveau. –

+0

oui bien sûr. dans mon cas, je le change très rarement, et ce n'est pas un problème pour moi –

Questions connexes