2010-12-12 12 views
1

Ich denke, das ist wirklich eine sehr lame Frage, aber ich denke, auf SO werde ich die Antwort schneller erhalten, als durch sie selbst googeln :)C# Objekt Modifikation

Lassen Sie uns sagen, dass ich eine Klasse mit einem Konstruktor haben:

public class TestClass { 

    private readonly IRepository repository; 

    public TestClass(IRepository repository) 
    { 
     this.repository = repository; 

     // Here is the non-obvious line - it invokes some 
     // method, which changes the internal contents of 
     // the repository object. 
     repository.AddSomething(...); 
    } 
} 

Und jetzt:

IRepository sqlRepository = new SqlRepository(...); 

TestClass testClass = new TestClass(sqlRepository); 

1) Ich bin nicht gut in Wert/Referenz in C# vorbei - so könnte jemand bitte eine Schritt-für-Schritt Erklärung geben, was in diesem Fall passiert.

2) Hat das sqlRepository Objekt geändert bekommen (ich nehme nicht) und ist es eine Möglichkeit, den Konstruktor von TestClassändern zu machen (ich weiß, es ist böse, nur für mich zu wissen)?

3) Würden die repository.AddSomething(...) und this.repository.AddSomething(...) Linien im Konstruktor den gleichen Effekt haben und warum?

4) Welchen Effekt hat readonly auf die Versuche des Repository Änderungen in diesem Beispiel?

Antwort

2
  1. In diesem Fall wird der Verweis auf sqlRespository in den ctor übergeben.

  2. Noch nicht. Wenn Sie AddSomething() aufrufen, ändert diese Methode tatsächlich die ursprüngliche Instanz. Wir haben immer noch nur ein Objekt und jeder berührt dieses Objekt. Es ist ein wichtiger Unterschied, dass alle Änderungen, die sie vornehmen, auf dieses Objekt vorgenommen werden, da jeder einen Verweis auf dasselbe Objekt hat. Wenn sie diese Variable jedoch einfach mit einem anderen Objekt überschreiben, gilt das nur lokal. Denken Sie daran, Variablen sind wie Slots. Wir können viele Slots haben, die alle auf dasselbe Objekt zeigen, aber das Ersetzen eines Slots durch einen Zeiger auf ein anderes Objekt hat keinen Einfluss auf die anderen Slots.

  3. Wenn Sie zuerst this.repository = repository dann sowohl der lokale Parameter repository und Elementvariable (Feld) genannt genannt repository einen Verweis auf dasselbe Objekt zu halten. Wir verwenden this., um klar zu sein, wir meinen die Elementvariable (Feld) und nicht der lokale Parameter oder die Variable.

  4. readonly bedeutet, dass Elementvariable/Feld nur vom Konstruktor zugewiesen werden kann. Stellen Sie sich die Elementvariable als einen Slot vor, in den wir ein Objekt einfügen können. Wenn der Steckplatz readonly ist, kann er nur während des Ctor-Aufrufs gefüllt werden. Danach kann es nicht ersetzt werden. Das heißt nicht bedeutet, dass das Objekt darin irgendwie "schreibgeschützt" ist. Das Objekt kann noch modifiziert werden, es kann einfach nicht durch ein anderes Objekt ersetzt werden.