Je suis incapable de comprendre la logique derrière Un type nullable est différent, car il n'est pas nécessaire d'être initialisé par nouvel opérateur. P> Suis je vois quelque chose ne va pas ici? p> éditéd- p> J'aurais dû poster le code dans la question initiale elle-même. Mais il suit ici - p> Liste
Liste
Liste
ref code> mot-clé si sa valeur doit être persistée entre les appels de fonction. Cela signifie donc qu'il affiche un comportement de type de valeur similaire à INT. LI>
list
Liste
9 Réponses :
La listeest censée être de type de valeur et non de type de référence. P> blockQuote>
mauvais! em>
int code> est un type de valeur.
Liste
code> est un type de référence. p>
Si c'était le cas, pourquoi réussir la liste
@Prash vous feriez cela si vous vouliez modifier la référence elle-même (c.-à-d.: Définissez-la sur NULL ou une liste différente). Mais je ne construirais pas normalement le code pour que cela soit nécessaire.
@Prastant: Vous n'avez pas besoin de. Quiconque vous a dit que vous faites, c'est toujours un crétin. Ce que le mot clé ref code> est, vous permet de définir le paramètre sur une autre liste
Pauvre, ancien ref code>; tellement mal compris. :)
Les types nullables sont toutefois implémentés comme des structures ( sans le mot clé code> nouveau code> est que la syntaxe ci-dessus est traduite automatiquement par le code qui fera le code qui fera la Suivant: p> Liste
structure nullable
Nullable<Int32> i = new Nullable<Int32>(3);
A Liste code> est un type de référence générique, vous l'utilisez avec une valeur de type int. Mais c'est toujours un type de référence. P>
ne pense pas à cela comme liste est une classe Liste
Liste
Le type des objets in em> la liste est une sorte de type de valeur, à l'exception des objets de type de valeur peuvent se retrouver en boîte (converti en objets de type de référence d'une sorte) de toute façon, donc ..cratch ce paragraphe une fois que vous comprenez cela. P> Liste
Notez que Liste
@ 0xa3: Je n'étais pas sûr de la façon dont la merde .net l'a fait. Je sais que Java est agaçant à ce sujet, mais ses entiers sont une tentative à moitié construite de faire ressembler des primitives à ressembler à des objets, alors que les "primitives" de .NET sont des objets réels.
Je pense que vous avez une hypothèse défectueuse dans votre première balle. L'objet de liste générique est définitivement un type de référence (sur le tas, pas la pile). Je ne sais pas pourquoi vous pensez que vous devez passer via ref code>. Ceci imprime "2" comme il devrait:
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
List<int> listIsARefType = new List<int>();
ModifyIt(listIsARefType);
ModifyIt(listIsARefType);
Console.WriteLine(listIsARefType.Count); // 2!
Console.ReadKey(true);
}
static void ModifyIt(List<int> l) {
l.Add(0);
}
}
}
Je pense qu'il est important de noter que toute liste
Vous devez comprendre la différence entre passer par référence em>, passer par valeur em> et transmettez-la par valeur em>. dans le Code Sample Vous avez publié, vous passez la em> référence em> à la liste Lorsque vous utilisez le considère cet exemple: p>
ref Code> Mot clé, vous passez la référence elle-même par référence. Cela signifie que non seulement vous pouvez modifier l'objet que la référence indique, mais vous pouvez également modifier la référence elle-même. P>
class Program
{
static void Main()
{
int foo = 0;
DoSomething1(foo);
Console.WriteLine(foo); // Outputs 0.
DoSomething1(ref foo);
Console.WriteLine(foo); // Outputs 1.
var bar = new List<int>();
DoSomething2(bar);
Console.WriteLine(bar.Count); // Outputs 1.
DoSomething2(ref bar);
Console.WriteLine(bar.Count); // Outputs 0.
}
// Pass by value.
static void DoSomething1(int number)
{
// Can't modify the number!
number++;
}
// Pass by value.
static void DoSomething1(ref int number)
{
// Can modify the number!
number++;
}
// Pass reference by value.
static void DoSomething2(List<int> list)
{
// Can't change the reference, but can mutate the object.
list.Add(25);
}
// Pass reference by reference.
static void DoSomething2(ref List<int> list)
{
// Can change the reference (and mutate the object).
list = new List<int>();
}
}
En plus des hypothèses erronées traitées dans d'autres réponses, vous dites: P>
Liste
code> doit être initialisé par un nouvel opérateur ... cela implique un Comportement de type de référence. P> blockQuote> Non, en C # L'opérateur
Nouveau code> n'est que la syntaxe pour appeler le constructeur d'un type. Il est utilisé pour les types de valeur de référence et définis par l'utilisateur (
struct code> s). P>
dans la méthode ModifyIt (), lorsque vous écrivez 'l = retourliste ()'; 'L' est maintenant dirigé vers un emplacement différent de la mémoire que celle de LISTISAREFTYPE dans votre méthode Test (). Fondamentalement, en écrivant "L" "=" quelque chose, vous avez enfreint le lien entre "L" et "LISISAREFTYPE". Afin de conserver le lien (qui assure que les deux objets, "L" et "LissiSareftype" pointant vers le même emplacement dans la mémoire), vous devez seulement travailler sur l'objet "L" (par exemple En appelant une fonction sur l'objet), ou utilisez le mot-clé ref dans le paramètre de la méthode ModifyIt (). p>
Que voulez-vous dire exactement avec votre point 1? Pourriez-vous donner un exemple pourquoi vous pensez avoir besoin de
ref code>?
@ 0xa3 => Créer une méthode1 qui prend la liste comme paramètre. Ensuite, dans la méthode de la méthode principale 1 une liste . Dans la méthode1, ajoutez des entiers à la liste. Dans la méthode principale, voir si vous obtenez ces entiers de retour.
MattMC3 a déjà posté un exemple comme celui-ci démontrant que vous n'avez pas besoin
ref code>.
En ce qui concerne votre code, le problème est que vous attribuez une nouvelle liste i>. Le code extérieur ne voit pas la nouvelle liste - mais si vous avez modifié la liste d'origine, cela verrait ces changements.
@Anon => Que voulez-vous dire par code extérieur ne voit pas la nouvelle liste?. Pouvez-vous s'il vous plaît élaborer.
@Prashant: Supposons que vous ayez une maison et une carte postale qui vous indique l'adresse de la maison. Vous copiez cette carte postale et donnez la copie à quelqu'un. S'ils vont à la maison et le changent, tous les autres verront la maison changée, mais s'ils construisent une nouvelle maison et gribouent de son adresse sur leur carte postale, cela n'affectera personne d'autre.
@Prashant - Je pense que @Anon essaie de décrire est que les variables détenant des types de référence contiennent simplement une référence à un emplacement en mémoire sur le tas. Ainsi, «L 'dans la méthode« Modiyit' »commence à désactiver le même emplacement que« LISTISAREFTYPE », mais obtient ensuite son adresse modifiée par l'appel vers« Nouvelle liste () 'et l'élément est ajouté à cette liste. .. 'LISTAREFTYPE' signifie toujours à l'emplacement d'origine - qui reste une liste vide. Belle question - m'a pris un moment pour l'obtenir! ;-)
Liste n'est pas un type de valeur.