-1
votes

Si un objet d'entrée sera cloné s'il s'agit de la valeur de retour?

Lorsque vous avez une méthode telle que xxx

ou quelque chose le long des lignes de xxx

ou Xxx

Si l'entrée est renvoyée, les péchés de rien changent, peuvent-ils être renvoyés comme eux-mêmes ou, si-ils, doivent-ils être clonés et retournés comme type de retour?


10 commentaires

Cela dépend de l'exigence, souhaitez-vous cloner le tableau (et ses objets) ou souhaitez-vous modifier le tableau existant?


Qui sait. Dépend du type de logique / but de votre méthode. Ne nous demandez pas, demandez-vous ;-)


Alors je suppose que ça n'a pas d'importance. Donc, si vous avez écrit quelque chose comme octet [] édité = non_edited.removeFirstelement (); il ne comptera pas, je pensais que édité obtiendrait fondamentalement non_edited 's ptr donc édité sera fondamentalement non_edited ? Mais alors, quand utiliseriez-vous Clone, uniquement dans des scénarios comme byte [] copie = non_edued.clone (); ?


Peu importe que vous retourniez le pointeur sur un tableau avec zéro éléments, car vous devez ajouter un élément que vous devez créer un nouveau tableau, il n'ya donc aucun moyen de modifier l'autre auttraper l'autre. S'il s'agissait d'une liste , ce serait une histoire différente.


@Rufusl et s'il s'agissait d'une liste ou d'int32 (qui n'a pas été changé), je vois maintenant que j'ai utilisé un exemple assez mauvais.


Le nom de la méthode retirezFirstelement implique que l'entrée doit avoir au moins un élément, et sinon, une exception doit être lancée. Sinon, vous devriez changer le nom de la méthode pour refléter la fonctionnalité réelle. Et puis je parie que ce sera assez évident que faire avec le problème de clonage. 😃


@Theodorzoulias Je ne comprends pas pourquoi les gens prennent cela si littéralement, son exemple pas une méthode réelle, son juste contexte à la question, j'aurais supposé que quelqu'un sur ce forum aurait dit oh, il signifie probablement dans Tous les scénarios et non seulement ceci 1 scénarios de tableau , mais je suppose que non.


Si l'exemple est défectueux, veuillez fournir un meilleur exemple. Si vous ne pouvez pas penser à un meilleur exemple, alors de quoi parle-t-on?


@Theodorzoulias J'ai mis à jour le OP, espérons que cela l'effache. Sinon, laissez-moi savoir et je vais volontiers ajouter d'autres exemples et informations.


Les développeurs de logiciels ont tendance à prendre les choses littéralement. Ce n'est peut-être qu'un exemple, mais la réponse de cet exemple pourrait être différente de la réponse à un exemple différent.


3 Réponses :


0
votes

Un tableau avec une longueur nulle est immuable, il peut donc être renvoyé en toute sécurité sans clonage.

Pour retirer un élément d'un tableau non vide, de toute façon, il doit être cloné car la longueur de la matrice ne peut pas être modifiée. xxx


5 commentaires

OK, alors que si c'était autre chose comme une méthode de vérification si une valeur est considérée que 100 et que cela est alors que 100 est renvoyé, alors que si l'entrée est inférieure ou égale à 100, peut-elle être renvoyée?


Le cas du renvoi d'une valeur (comme un int ) est également différent car un tableau est un type de référence, ce qui renvoie l'original vs. Le retour d'un clone est potentiellement différent. Avec des types de valeur, cela n'a pas d'importance du tout. Même si vous "retourne" l'argument, vous ne retournez pas vraiment l'entrée - vous retournez un nouveau int avec la même valeur que l'entrée.


@Scotthannen Merci, maintenant c'est la réponse que je cherchais, merci d'avoir refusé cela pour moi.


J'apprécie cela, mais de scinder les cheveux, je n'ai fourni qu'un commentaire, pas une réponse. (Plus d'être littéral.)


@Scotthannen peu importe, merci beaucoup. De plus, je pense que vous devriez être capable de soumettre ce commentaire comme une réponse, Sins, j'ai édité la question et c'est plus "bien arrondi".



2
votes

Étant donné que la signature de votre méthode est la suivante:

SomeArray.RemoveFirstElement();


0 commentaires

0
votes

Ceci est mon avis concernant les nouveaux exemples:

public static T[] GetZeroArrayIfNot<T>(this T[] array)
{
    if (array == null)
    {
        throw new ArgumentNullException("array");
    }
    else if (array.Length == 0)
    {
        return array;
        // because the name of the method implies that a zero-length array
        // should be treated differently than a non-zero-length array
    }
    return new T[0];
}

public static int HundredOrLess(int num)
{
    if (num <= 100)
    {
        return num;
        // It doesn't matter. The caller is not affected either way
        // because num is an immutable value type passed by value
    }
    return 100;
}

public static List<T> ReturnItself<T>(List<T> list)
{
    return list; // Because the method name says so
}


0 commentaires