Информация об изменениях

Сообщение Re: Когда new, a koгда можно без? от 15.10.2019 14:07

Изменено 15.10.2019 14:11 alexzzzz

Re: Когда new, a koгда можно без?
Здравствуйте, 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;
    }
}


Можно так:
Vector3 v = new Vector3(1, 2, 3);

а можно так:
Vector3 v;
v.x = 1;
v.y = 2;
v.z = 3;
Re: Когда new, a koгда можно без?
Здравствуйте, 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;
    }
}


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

а можно так:
Vector3 v; // объявили переменную value-типа
v.x = 1; // вручную инициализировали все-
v.y = 2; // -все-
v.z = 3; // -все её поля