2016-08-02 16 views
1

Ich muss den folgenden Code, der in C# 6.0 ist, in eine niedrigere Version konvertieren, die in .NET Framework 4.5 funktioniert.C# 6.0 bis <6.0

public ImageCollection Strokes { get; } = new ImageCollection(); //C# 6.0 

Wie kann ich das konvertieren?

Versucht den folgenden Code, hatte aber einige Probleme in der Anwendung.

public ImageCollection Strokes 
     { get { return new ImageCollection(); } } //< 6.0 

Bitte helfen. Gibt es auch eine Möglichkeit, diese zu konvertieren? Oft bekomme ich Lösungen in 6.0 die ich downgraden muss.

+0

Ich werde dies im Konstruktor tun – MichaelMao

Antwort

3

Es ist nicht das Gleiche.

Im ersten Beispiel haben Sie eine Eigenschaft, die durch den Konstruktor instanziiert wird.

Im zweiten Beispiel geben Sie bei jedem Zugriff auf die Eigenschaft eine neue Instanz zurück.

Die richtige refactor sieht wie folgt aus:

public ImageCollection Strokes 
{ 
    get; private set; 
} 

public constructor() 
{ 
    Strokes = new ImageCollection(); 
} 
+1

Danke, arbeitete. Wird einmal markieren, wenn SO erlaubt – iamCR

0

Ich weiß nicht, welche Probleme Sie mit Blick auf arr aber Code wie Sie den Code unten ändern immer das neue Objekt erstellen, aber 6.0 eine Zeit der Initialisierung Versuchen

var imgCollection = new ImageCollection(); 

public ImageCollection Strokes 
    { get { return imgCollection; } } //< 6.0 
3

Sie werden die müssen zuweisen Eigenschaft in Ihrem Konstruktor.

Option 1 - Eine Eigenschaft mit einem privaten Setzer:

class Example 
{ 
    public ImageCollection Strokes { get; private set; } 

    public Example() 
    { 
     Strokes = new ImageCollection(); 
    } 
} 

Option 2 - einer Eigenschaft mit einem Getter nur von einem privaten Nur-Lese-Bereich gesichert:

class Example 
{ 
    public ImageCollection Strokes { get { return _strokes; } } 

    private readonly ImageCollection _strokes; 

    public Example() 
    { 
     _strokes = new ImageCollection(); 
    } 
} 

Option 3 - Wie Option 2, aber Zuweisung des Feldes inline statt im Konstruktor:

class Example 
{ 
    public ImageCollection Strokes { get { return _strokes; } } 

    private readonly ImageCollection _strokes = new ImageCollection(); 
} 
1

Sie könnten ein privates Feld schaffen, dass der Getter verwendet:

class MyClass 
{ 
    private ImageCollection _strokes = new ImageCollection(); 
    public ImageCollection Strokes { get { return _strokes } } 
} 

Oder man könnte es im Konstruktor initialisieren.

class MyClass 
{ 
    public ImageCollection Strokes { get; private set; } 

    public MyClass() 
    { 
      Strokes = new ImageCollection(); 
    } 
} 

Denken Sie daran, es von der Klasse in allen Konstrukteuren zu initialisieren, oder zumindest Ihren anderen Konstrukteuren einen Konstruktor aufrufen, die tut.


Das Problem mit Ihrer Lösung besteht darin, dass es nennt eine neue Instanz von ImageCollection jedes Mal get wird zurückgibt. Dies erzeugt mehrere, die nichts miteinander zu tun haben. Das Ändern eines wird den Rest nicht ändern.