Existe-t-il un moyen de passer des arguments nuls aux méthodes C # (quelque chose comme les arguments nuls en c ++)?
Par exemple:
Est-il possible de traduire la fonction c ++ suivante en méthode C #:
private void Example(int* arg1, int* arg2)
{
if(arg1 == null)
{
//do something
}
if(arg2 == null)
{
//do something else
}
}
Oui. Il existe deux types de types dans .NET: les types de référence et les types de valeur.
Les types de références (généralement des classes) sont toujours référencés, ils supportent donc null sans travail supplémentaire. Cela signifie que si le type d'une variable est un type de référence, la variable est automatiquement une référence.
Les types de valeur (par exemple, int) par défaut n’ont pas de notion de null. Cependant, il existe pour eux un wrapper appelé Nullable. Cela vous permet d'encapsuler le type de valeur non nullable et d'inclure des informations nulles.
L'utilisation est légèrement différente, cependant.
// Both of these types mean the same thing, the ? is just C# shorthand.
private void Example(int? arg1, Nullable<int> arg2)
{
if (arg1.HasValue)
DoSomething();
arg1 = null; // Valid.
arg1 = 123; // Also valid.
DoSomethingWithInt(arg1); // NOT valid!
DoSomethingWithInt(arg1.Value); // Valid.
}
Je pense que l'équivalent C # le plus proche de int*
serait ref int?
. Parce que ref int?
permet à la méthode appelée de renvoyer une valeur à la méthode appelante.
int*
ref int?
Vous pouvez utiliser NullableValueTypes (comme int?) Pour cela. Le code serait comme ça:
private void Example(int? arg1, int? arg2)
{
if(!arg1.HasValue)
{
//do something
}
if(!arg2.HasValue)
{
//do something else
}
}
De C # 2.0:
private void Example(int? arg1, int? arg2)
{
if(arg1 == null)
{
//do something
}
if(arg2 == null)
{
//do something else
}
}
À partir de C # 2.0, vous pouvez utiliser le type générique nullable Nullable. En C #, il existe une notation abrégée du type suivi de?
par exemple.
private void Example(int? arg1, int? arg2)
{
if(arg1 == null)
{
//do something
}
if(arg2 == null)
{
//do something else
}
}
On répond déjà bien à la question du PO, mais le titre est juste assez large pour que je pense qu'il tire profit de l'amorce suivante:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace consolePlay
{
class Program
{
static void Main(string[] args)
{
Program.test(new DateTime());
Program.test(null);
//Program.test(); // <<< Error.
// "No overload for method 'test' takes 0 arguments"
// So don't mistake nullable to be optional.
Console.WriteLine("Done. Return to quit");
Console.Read();
}
static public void test(DateTime? dteIn)
{
Console.WriteLine("#" + dteIn.ToString() + "#");
}
}
}
sortie:
#1/1/0001 12:00:00 AM#
##
Done. Return to quit
Vous pouvez utiliser 2 façons: int? ou Nullable, les deux ont le même comportement. Vous pouvez faire un mélange sans problèmes, mais il vaut mieux choisir le code le plus propre.
Option 1 (avec?):
private void Example(int? arg1, int? arg2)
{
if (arg1.HasValue)
{
//do something
}
if (arg1.HasValue)
{
//do something else
}
}
Option 2 (avec Nullable):
private void Example(Nullable<int> arg1, Nullable<int> arg2)
{
if (arg1.HasValue)
{
//do something
}
if (arg1.HasValue)
{
//do something else
}
}
À partir de C # 4.0, il existe une nouvelle façon de faire la même chose avec plus de flexibilité. Dans ce cas, le framework offre des paramètres optionnels avec des valeurs par défaut . Vous pouvez ainsi définir une valeur par défaut si la méthode est appelée sans tous les paramètres.
Option 3 (avec les valeurs par défaut)
private void Example(int arg1 = 0, int arg2 = 1)
{
//do something else
}