J'ai deux questions et je voudrais de l'aide, s'il vous plaît.Nullable vs Out Paramètre lors de la vérification des valeurs valides/existantes
J'ai un code client qui doit accéder à une variable/valeur qui change dans le temps, en fait, il est calculé lors de la récupération, et il est récupéré par plusieurs méthodes plusieurs fois sur l'exécution, mais son calcul n'est pas toujours possible car les exigences pour cela ne sont pas toujours présentes, dans ce cas, un faux ou nul est retourné et le client vérifie cela pour décider de continuer. Maintenant, j'ai deux approches, la première, A, est mon classique, B cependant, me semble bien aussi.
A) J'ai cette méthode avec un paramètre de manière similaire aux méthodes TryParse sur certaines bibliothèques C#:
public bool GetLeadingTrailSegment(out Vector3 lastTrailSegment)
{
if (_line.positionCount > 1)
{
lastTrailSegment = lead - _line.GetPosition(_line.positionCount - 2);
return true;
}
lastTrailSegment = Vector3.zero;
return false;
}
B) J'ai cette propriété annulable qui essaie de faire le même travail que le code ci-dessus:
public Vector3? leadingTrailSegment
{
get
{
if (_line.positionCount > 1)
{
return lead - _line.GetPosition(_line.positionCount - 2);
}
return null;
}
}
le code client est la suivante:
A) Ici, le bool indique au code client si la valeur est sûre (utile?) À utiliser.
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
Vector3 leadingTrailSegment;
if (pointer.GetLeadingTrailSegment(out leadingTrailSegment))
{
return !midline.ParallelTo(leadingTrailSegment);
}
return true;
}
B) Ici, le fait de la propriété HasValue du annulable étant faux indique au client wether il est sûr:
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
Vector3? leadingTrailSegment = pointer.leadingTrailSegment;
if (leadingTrailSegment.HasValue)
{
return !midline.ParallelTo(leadingTrailSegment.Value);
}
return true;
}
Première question: De ces deux approches, lequel est le meilleur ou quels sont les avantages/inconvénients entre ou défauts en leur sein?
Deuxième question: Je l'habitude d'avoir l'approche client B écrit:
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
if (pointer.leadingTrailSegment.HasValue)
{
return !midline.ParallelTo(pointer.leadingTrailSegment.Value);
}
return true;
}
C'était mal, non? Parce que la propriété Value du nullable peut avoir changé par le deuxième appel. J'aime mieux l'approche des paramètres out, vous pouvez utiliser le résultat dans la clause if, et la variable peut même être déclarée inline dans d'autres versions de C# mais j'aimerais vraiment donner une chance aux nullables et les rendre utile dans des situations comme celles-ci (et pas seulement lorsque je cherche une valeur non assignée, quels sont les cas dans lesquels je les utilise). J'espère que quelqu'un pourra donner son avis à ce sujet.
Merci.
Pour la deuxième question, ajoutez un 'Vector3? segment = pointer.leadingTrailSegment; 'puis remplacez vos deux autres lignes par' if (segment.HasValue) 'et' return! midline.ParallelTo (segment.Value); 'une fois que vous avez copié le' Vector3? 'localement, sa valeur ne peut pas - changement plus long en raison de sa structure immuable. –
Donc, mes devinettes étaient correctes alors? Je l'ai fait comme il est écrit dans l'approche B du client un exemple ci-dessus. Merci. – Ruri
Oui, B dans la première question serait la meilleure façon de le faire. En outre, vos balises sont erronées. 'C# -4.0' n'est pas .NET 4.0. Unity3d à partir de 2017.1.0 Supporte C# 6 –