2016-08-02 2 views
1

Мне нужно преобразовать следующий код, который находится в C# 6.0, в более низкую версию, которая работает в .NET framework 4.5.C# 6.0 до <6.0

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

Как это сделать?

Пробовал приведенный ниже код, но имел несколько проблем в приложении.

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

Просьба помочь. Также есть ли способ их преобразования? Часто я получаю решения в 6.0, которые мне нужно понизить.

+0

Я сделаю это в конструкторе – MichaelMao

ответ

3

Его не то же самое.

В первом примере у вас есть свойство, которое будет создано через конструктор.

Во втором примере вы возвращаете новый экземпляр при каждом доступе к свойству.

Правильный рефакторинг выглядит следующим образом:

public ImageCollection Strokes 
{ 
    get; private set; 
} 

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

Спасибо, работал. Будет отмечать один раз, когда SO – iamCR

0

Я не знаю, какие вопросы вы обр облицовочный но изменить код, как показано ниже ваш код всегда создает новый объект, но 6,0 один раз инициализации Попробуйте

var imgCollection = new ImageCollection(); 

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

Вы будете иметь, чтобы назначить свойство в вашем конструкторе.

Вариант 1 - Свойство с частным инкубаторе:

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

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

Вариант 2 - свойство с геттер только при поддержке со стороны частного только для чтения поле:

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

    private readonly ImageCollection _strokes; 

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

Вариант 3 - Как вариант 2, но назначая поле inline вместо конструктора:

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

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

Вы можете создать частное поле, что добытчик использует:

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

Или вы можете инициализировать его в конструкторе.

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

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

Только не забудьте инициализировать его в всех конструкторах класса, или, по крайней мере, ваши другие конструкторы называют конструктор, который делает.


Проблема с вашим решением является то, что она возвращает новый экземпляр ImageCollection каждый раз get называется. Это создает множество, которые не имеют ничего общего друг с другом. Изменение одного не изменит остальных.