Pendant que j'étudiais le délégué qui est en fait une classe abstraite Delegate.cs
, j'ai vu la méthode suivante dans laquelle je ne comprends pas
- Pourquoi la valeur de retour utilise-t-
?
elle bien qu'elle soit déjà un type de référence ( classe ) ?[]?
signification sur le paramètre
Pourriez-vous expliquer?
public static Delegate? Combine(params Delegate?[]? delegates)
{
if (delegates == null || delegates.Length == 0)
return null;
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
c#
.net
null-coalescing-operator
nullable-reference-types
null-coalescing
snr - Réintégrer Monica
la source
la source
Réponses:
Explication étape par étape:
params Delegate?[] delegates
- C'est un tableau de nullableDelegate
params Delegate?[]? delegates
- L'ensemble du tableau peut être nullableÉtant donné que chaque paramètre est du type
Delegate?
et que vous retournez un index duDelegate?[]?
tableau, il est logique que le type de retour soitDelegate?
sinon le compilateur retournerait une erreur comme si vous returiez et àint
partir d'une méthode qui renvoie une chaîne.Vous pouvez par exemple changer votre code pour retourner un
Delegate
type comme celui-ci:la source
?
elle bien qu'elle soit déjà un type de référence (classe)?
pour exactement la même raison pour laquelle la valeur d'argument utilise le?
. Si vous comprenez ce dernier, vous comprenez automatiquement le premier. Parce que la méthode peut retourner null , comme le paramètre peut accepter null . Autrement dit, ils peuvent tous deux contenir null .Since each parameter is of the type Delegate? and you return an index of the Delegate?[]? array, then it makes sense that the return type is Delegate?
Foo?
a uneHasValue
propriété soignée , alorsFoo
qu'il doit être== null
vérifié (4) Il communique aux développeurs qui lisent la signature de la méthode que les valeurs nulles sont un résultat possible, attendu et correct. (5) Le code semble être écrit par quelqu'un qui aime beaucoup la nullité et est explicite à ce sujet.Les types de référence nullables sont nouveaux dans C # 8.0, ils n'existaient pas auparavant.
C'est une question de documentation et de la façon dont les avertissements sont générés au moment de la compilation.
L'exception «objet non défini sur une instance d'un objet» est une exception courante. Mais il s'agit d'une exception d'exécution, elle peut déjà être partiellement découverte au moment de la compilation.
Pour un réglement,
Delegate d
vous pouvez toujours appelerce qui signifie, vous pouvez le coder, au moment de la compilation, rien ne se passera. Il peut soulever des exceptions lors de l'exécution.
Alors que pour un nouveau
Delegate? p
codeproduira un avertissement du compilateur.
CS8602: Dereference of a possibly null reference
sauf si vous écrivez:ce qui signifie, appelez uniquement s'il n'est pas nul.
Donc, vous documentez une variable peut contenir null ou non. Il déclenche des avertissements plus tôt et peut éviter plusieurs tests pour null. La même chose que vous avez pour int et int?. Vous savez avec certitude, l'un n'est pas nul - et vous savez comment convertir l'un en l'autre.
la source
Delegate
n'est pas nulle. Vous prétendez simplement que vous savez avec certitude (ce qui est suffisant dans la plupart des cas).int
il ne peut jamais être nul. Si vous en avez un,Delegate
il peut être nul (pour diverses raisons, par exemple la réflexion). Il est généralement prudent de supposer queDelegate
(en C # 8 avec NRT activé) n'est pas nul, mais vous ne savez jamais avec certitude (où pourint
nous savons avec certitude).En C # 8, il faut explicitement marquer les types de référence comme nullables.
Par défaut, ces types ne peuvent pas contenir null, un peu comme les types de valeur. Bien que cela ne change pas la façon dont les choses fonctionnent sous le capot, le vérificateur de type vous demandera de le faire manuellement.
Le code donné est refactorisé pour fonctionner avec C # 8, mais il ne bénéficie pas de cette nouvelle fonctionnalité.
Voici un exemple de code mis à jour (ne fonctionnant pas, juste une idée) exploitant cette fonctionnalité. Cela nous a sauvé d'un contrôle nul et a un peu simplifié cette méthode.
la source
those types are not able to contain null
, notez qu'il génère un avertissement du compilateur , pas une erreur. Le code fonctionnera correctement (bien qu'il puisse générer des exceptions NullReferenceExceptions). Cela se fait dans un souci de compatibilité descendante.