11
votes

Exemple de pratique pratique de "réf"

Je suis en difficulté à utiliser "REF" (pour passer l'argument par référence) dans une application réelle. J'aimerais avoir des exemples simples et principalement significatifs. Tout ce que j'ai trouvé jusqu'à présent pourrait être facilement refait à l'ajout de type de retour à la méthode. Aucune idée de quelqu'un? Merci!


0 commentaires

6 Réponses :


4
votes

Le Tryparse Code> Les méthodes intégrées dans le cadre sont des exemples typiques. Ils utilisent out code> au lieu de ref code> mais c'est la même sémantique, c'est juste que l'appelant n'a pas besoin d'initialiser la valeur. Exemple:

int result;
bool isSuccess = int.TryParse("some string", out result);
if (isSuccess)
{
    // use the result here
}


4 commentaires

Oui, mais je veux dire spécifiquement réfé dans n'importe quel exemple pratique :) Je pensais que c'est simple mais je ne peux toujours penser aucun exemple.


@LOJ, ref est utile lorsque vous souhaitez modifier un type de valeur à l'intérieur d'une méthode.


Je sais, mais pourriez-vous me donner un exemple pratique?


@LOJ: J'utilise tryparse tout le temps et occasionnellement des fonctions d'assistance similaires comme celle-ci. Comment est-il impraticable?



1
votes
public static void Main(string args[])
{
    int i=0;
    AddSomething(ref i);
    AddSomething(ref i);
    AddSomething(ref i);
    AddSomething(ref i);


    string mystr = "Hello";
    AddSomeText(ref mystr);
    Console.WriteLine(mystr);


    Console.WriteLine("i = {0}", i);
}


public static void AddSomeText(ref string str)
{
    str+= " World!";
}


public static void AddSomething(ref int ii)
{
    ii+=1;
}

2 commentaires

Si Tryparse n'est pas pratique, ce certainement n'est pas. En fait, si j'ai vu du code comme celui-ci dans une application, j'étais chargé de maintenir, je reculerais probablement en horreur.


Cela ne semble pas être un exemple significatif significatif, qui est ce que l'OP a demandé.



5
votes

One éventuellement cas d'angle exemple: interlocked.incrèce . Sans passer la variable par référence, il n'ya aucun moyen d'accomplir atomique atomique.

Je ne peux pas dire que j'ai utilisé Réf très moi-même, pour être honnête - je devrais généralement éviter la nécessité de retourner plusieurs valeurs, et même alors out > est généralement suffisant. Beaucoup de cas où je suis vu REF utilisé, il est dû à l'auteur qui ne comprend pas comment les arguments sont transmis en .NET lorsqu'il s'agit de types de référence.


3 commentaires

Je pense utiliser pour des types de valeur bien sûr


@LOJ: Je ne pense pas qu'il soit nécessaire de "bien sûr" à ce sujet - ref est toujours potentiellement utile pour les types de référence, si vous souhaitez que l'expression de l'argument de l'appelant se réfère à un autre objet après l'appel.


"Beaucoup de cas où j'ai vu Référum utilisé, cela a été dû à l'auteur qui ne comprend pas comment les arguments sont passés dans .NET lorsqu'il s'agit de types de référence." Très vrai Jon !!!



0
votes

L'un des endroits les plus courants que je le vois, est de sauvegarder des méthodes de certains cadres.

La raison en est que, dans de nombreux cas, il n'est pas réellement possible de maintenir le même objet sur un appel de sauvegarde, si l'objet est sérialisé sur une autre machine, puis revient comme une nouvelle instance (peut-être avec des défauts supplémentaires). Dans ce cas, vous avez besoin de la référence pour que la référence initiale ne soit plus valide.

Quant à sa nécessité, je ne peux pas trouver un exemple où il serait nécessaire. La plupart des endroits sont tout à fait bien.


0 commentaires

21
votes

Le meilleur exemple dans mon esprit est une fonction pour échanger deux valeurs de variables: xxx

usage: xxx

une fonction comme Celui-ci, ne peut pas être fait sans le mot-clé ref .


7 commentaires

Excellent! Maintenant, je doute que je sois un bon programmeur, cela ne me viendrait jamais à l'esprit.


@LOJ: Plus que tout, je pense que ce que vous devriez avoir appris des réponses à cette question est que c'est assez rare que vous aurez une utilisation pour le mot clé ref . Le fait que vous ne pouviez pas y penser, ce n'est pas une indication que vous êtes un mauvais programmeur.


@LOJ: Oui, Cody a raison. J'ai utilisé le mot-clé refaterfi plus que rarement. J'ai pensé à la fonction d'échange parce que c'est juste l'exemple ref de je me souviens toujours (je ne sais pas pourquoi)


Je pense que c'est un exemple très agréable, même pour des types non génériques, cela rend l'échange élégant et facile.


Je ferais attention à ce swap comme ébranlant une classe personnalisée contenant une chaîne que la chaîne sera échangée, vous n'avez pas besoin de la référence, car c'est déjà une référence et seules les données de la référence seront modifiées. Lorsque vous passez la chaîne, vous essayez d'échanger la référence elle-même. Une bonne référence pour cela est ici: Stackoverflow.com/Questions / 1096449 / ... Donc, dans un sens que j'ai en désaccord avec l'hypothèse que cette fonction ne peut pas être faite sans le clavier Ref. Il suffit de mettre votre chaîne dans une classe.


@Marcrousseel: Je pense que vous devriez relire avec soin la meilleure réponse à cette question, car l'OMI vous confondre "Type de référence" avec la manière des arguments de passage "par référence" ou "par valeur" ...


@Digemall non, je ne faisais que dire que cela peut être fait sans réf. Désolé pour tout malentendu. Par la manière dont la réponse est parfaitement valide.



0
votes

Je pense qu'un bon exemple serait un trampoline.

C'est là que vous prenez une fonction récursive et vous retrouvez à une méthode qui s'appelle répétiment sur un ensemble de valeurs. La raison étant que au lieu d'entrer dans la pile très profondément, la pile reste à plat car vous revenez après chaque appel au lieu de vous appeler.

Cordialement GJ


0 commentaires