2017-03-06 6 views
1

Comme ci-dessous le code exprimé, je veux SomeMethodEst-il possible qu'un paramètre de méthode C# d'une sorte d'int peut accepter nulle et peut mettre à jour l'argument

  • ont un paramètre d'une sorte de int
  • peut accepter null comme paramètre
  • si le paramètre est pas nul, il utilisera sa valeur, puis mettez à jour la valeur de la variable argument appel2

    void Caller1() 
    { 
        SomeMethod(null, ...); 
    } 
    
    void Caller2() 
    { 
        int argument = 123; 
        SomeMethod(argument, ...); 
        Debug.Assert(argument == 456); 
    } 
    
    void SomeMethod(SomeKindOfInt parameter, ...) 
    { 
        if (parameter != null) 
        { 
         // use the value of parameter; 
         parameter = 456; // update the value of argument which is in Caller2 
        } 
    } 
    

Essayé et déclare:

  • ref int ne peut pas accepter null
  • int? Impossible de mettre à jour l'argument dans l'appelant
  • Créer une classe Wrapper personnalisée de int l'a fait, mais existe-t-il un moyen léger ou est-ce que C# ou.
  • Il n'est pas bon de le diviser en deux méthodes parce qu'il y a une grosse logique à l'intérieur qui est commune chaque fois que le paramètre est nul ou nul.
+2

Pourquoi ne pas utiliser une valeur de retour dans votre méthode? – Jehof

+1

Que diriez-vous de 'ref int?'? – dotctor

+0

@ Jehof, Merci, int? paramètre et avec la valeur de retour résoudre mon problème – zhiyazw

Répondre

2

On y est presque, vous pouvez utiliser int? pour permettre que la valeur null et le mot-clé mis ref. Pourquoi ne pas utiliser une valeur de retour dans votre méthode?

static void Main(string[] args) 
{ 
    int? test1 = null; 
    SomeMethod(ref test1); 
    Console.WriteLine(test1); 
    // Display 456 

    int? test2 = 123; 
    SomeMethod(ref test2); 
    Console.WriteLine(test2); 
    // Display 123 

    Console.ReadLine(); 
} 

static void SomeMethod(ref int? parameter) 
{ 
    if (parameter == null) 
    { 
     parameter = 456; 
    } 
} 
+0

Merci, ref int? peut le faire mais il n'accepte pas SomeMethod littérale (null, ..), il doit appeler comme ceci: int? inutilisé = null; SomeMethod (ref inutilisé). Dans mon cas particulier, je préfère la solution de Jehof. Merci quand même. – zhiyazw