Re: Когда new, a koгда можно без?
От: alexzzzz  
Дата: 15.10.19 14:07
Оценка: 3 (1) +3
Здравствуйте, nt2000, Вы писали:

N>Как определяете при объявлении переменных? Есть признаки или надо просто запомнить?


Объявление переменной и new — вещи перпендикулярные. Чтобы объявить переменную, достаточно написать её тип, её имя и всё — переменная объявлена:
int x;
DateTime d;
MyClass instance;


Дальше мы, вероятно, хотим этой переменной что-нибудь присвоить. Вопрос, что именно? Если какое-то уже существующее значение (константу, литерал, результат выражения, значение другой переменной...), то берём и присваиваем без всяких new:
x = 5;
x = y + 10;
dateTime = default;
dateTime = DateTime.Now;
instance = null;
instance = someOtherInstance;


Оператор new требуется, когда нужно создать новый объект ссылочного типа (по-другому новые объекты ссылочных типов не создаются, экзотику не рассматриваю):
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass(...);


или нужно получить новое значение value-типа, через конструктор этого типа:
DateTime dateTime = new DateTime(...);


Для value-типов альтернативой вызову конструктора может быть ручная инициализация всех имеющихся полей. Например:
struct Vector3
{
    public float x, y, z;
    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    public Vector3(float value)
    {
        this.x = value;
        this.y = value;
        this.z = value;
    }
}


Можно так:
Vector3 v1 = new Vector3(1, 2, 3); // объявили переменную и вызвали конструктор типа для "конструирования" нового значения этого типа
Vector3 v2 = new Vector3(1); // аналогично

а можно так:
Vector3 v; // объявили переменную value-типа,
v.x = 1; // вручную инициализировали все-
v.y = 2; // -все-
v.z = 3; // -все её поля
Отредактировано 15.10.2019 14:24 alexzzzz . Предыдущая версия . Еще …
Отредактировано 15.10.2019 14:24 alexzzzz . Предыдущая версия .
Отредактировано 15.10.2019 14:19 alexzzzz . Предыдущая версия .
Отредактировано 15.10.2019 14:11 alexzzzz . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.