Сообщение Re: Когда new, a koгда можно без? от 15.10.2019 14:07
Изменено 15.10.2019 14:11 alexzzzz
Re: Когда new, a koгда можно без?
Здравствуйте, nt2000, Вы писали:
N>Как определяете при объявлении переменных? Есть признаки или надо просто запомнить?
Объявление переменной и new — вещи перпендикулярные. Чтобы объявить переменную, достаточно написать её тип, её имя и всё — переменная объявлена:
Дальше мы, вероятно, хотим этой переменной что-нибудь присвоить. Вопрос, что именно? Если какое-то уже существующее значение (константу, литерал, результат выражения, значение другой переменной...), то берём и присваиваем без всяких new:
Оператор new требуется, когда нужно создать новый объект ссылочного типа (по другому новые объекты ссылочных типов не создаются, экзотику не рассматриваю):
или нужно получить новое значение value-типа, через конструктор этого типа:
Для value-типов альтернативой вызову конструктора может быть ручная инициализация всех имеющихся полей. Например:
Можно так:
а можно так:
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 — вещи перпендикулярные. Чтобы объявить переменную, достаточно написать её тип, её имя и всё — переменная объявлена:
Дальше мы, вероятно, хотим этой переменной что-нибудь присвоить. Вопрос, что именно? Если какое-то уже существующее значение (константу, литерал, результат выражения, значение другой переменной...), то берём и присваиваем без всяких new:
Оператор new требуется, когда нужно создать новый объект ссылочного типа (по другому новые объекты ссылочных типов не создаются, экзотику не рассматриваю):
или нужно получить новое значение value-типа, через конструктор этого типа:
Для value-типов альтернативой вызову конструктора может быть ручная инициализация всех имеющихся полей. Например:
Можно так:
а можно так:
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; // -все её поля