new для типов-значений
От: ylem  
Дата: 07.04.10 23:48
Оценка:
У меня у одного вызывает диссонанс new для типов значений в C#?

Ну сами по судите:

var point = new Point(10, 20);

Ну какая же она новая? Эта точка была за 500 лет до того, как я напечатал эту строчку и будет еще 500 лет (а то и дольше) после этого.
Где я заблуждаюсь?
Re: new для типов-значений
От: Sinix  
Дата: 08.04.10 00:07
Оценка: :)
Здравствуйте, ylem, Вы писали:

Y>У меня у одного вызывает диссонанс new для типов значений в C#?

А при чём здесь значимые типы?
var text = new String('a',123);
var device = new StoneAxe();

Предлагаете заменить new на old?

*Вспоминается число пи, в котором "закодировано всё на свете"
Re: new для типов-значений
От: Zard0z  
Дата: 08.04.10 00:37
Оценка:
Здравствуйте, ylem, Вы писали:

Y>У меня у одного вызывает диссонанс new для типов значений в C#?


Y>Ну сами по судите:


Y>var point = new Point(10, 20);


Y>Ну какая же она новая? Эта точка была за 500 лет до того, как я напечатал эту строчку и будет еще 500 лет (а то и дольше) после этого.

Y>Где я заблуждаюсь?

Не, _этой_ точки не было
Предложите более понятный способ инициализировать всякие структы
Хотя C# идёт всё дальше от понятности/читабельности
Re[2]: new для типов-значений
От: ylem  
Дата: 08.04.10 01:04
Оценка: +1 :)
Z>Не, _этой_ точки не было

Штука как раз в том, что эта точка была.
И после того, как вы "создадите новую" точку var point2 = new Point(10, 20); это будет все та же самая точка.
Все, что тут создается нового, это переменная, которая есть часть программы, но уж никак не часть мира точки.

Z>Предложите более понятный способ инициализировать всякие структы


line = Line(Point(0, 0), Point(5, 2));
circle = Circle(Point(5, -1), -2.5);

Вы же когда по русски на листочке пишете координаты точки, не говорите, что это новая точка. Вы просто на нее "ссылаетесь".

Z>Хотя C# идёт всё дальше от понятности/читабельности


Зачем писать слово "new", которое все равно ничего не делает?
Re[2]: new для типов-значений
От: ylem  
Дата: 08.04.10 01:09
Оценка: :)
S>А при чём здесь значимые типы?
S>
S>var text = new String('a',123);
S>var device = new StoneAxe();
S>


Со строкой не возьмусь судить, а с топором -- мы действительно только что создали образ нового топора (и я настаиваю на том, что это именно образ нового топора, а не новый образ топора )
Если мы напишем еще одну такую же строчку, мы создадим новый топор, хоть и такой же (прошу прощения за банальности).

S>Предлагаете заменить new на old?


Предлагаю слово, которое вроде бы ничего не делает заменить на ничто.
Re[3]: new для типов-значений
От: Sinix  
Дата: 08.04.10 01:58
Оценка:
Здравствуйте, ylem, Вы писали:

Y>Зачем писать слово "new", которое все равно ничего не делает?


0) Явная декларация намерений.
1) Сложнее находить аллокацию новых объектов (впрочем при наличии implicit cast оно и сейчас не везде очевидно).
2)
class PointFactory: IPointFactory // IPointFactory определён в сборке написанной без вашего ограничения  
{
  public Point Point(int x, int y)
  {
    return ??? // Придётся придумать костыль аля Point.Point...
  }
}
Re[4]: new для типов-значений
От: ylem  
Дата: 08.04.10 03:44
Оценка:
0. Можете сформулировать намерение?

1. О каком новом объекте Вы говорите? О переменной или о значении? Значение не новое, оно просто есть такое.
Вам же не приходит в голову считать, что при "var i = 1;" мы "аллоцировали новый объект"?

3. В крайнем случае выкрутиться можно всегда.
В нормальном если мембер и тип имеют одно и то же имя, это говорит о том, что в какой-то из разов было лень подумать, как правило.
Re[4]: new для типов-значений
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.04.10 04:51
Оценка: 1 (1) +3
Здравствуйте, Sinix, Вы писали:

S>
S>    return ??? // Придётся придумать костыль аля Point.Point...
S>


return тоже не нужен

Предлагаю топикстартеру обратить внимание на другие языки.
Re: new для типов-значений
От: 0x7be СССР  
Дата: 08.04.10 05:17
Оценка: +1
Здравствуйте, ylem, Вы писали:

Y>Где я заблуждаюсь?

У меня встречный вопрос: а зачем вообще ключевое слово "new" в C#? Понятно в С++ надо было разделять динамические и автоматические/статические объекты, для выделения динамических пришлось применять ключевое слово. Но в С#-то оно зачем?
Re[3]: new для типов-значений
От: Трурль  
Дата: 08.04.10 05:28
Оценка:
Здравствуйте, ylem, Вы писали:

Y>И после того, как вы "создадите новую" точку var point2 = new Point(10, 20); это будет все та же самая точка.

Y>Все, что тут создается нового, это переменная, которая есть часть программы, но уж никак не часть мира точки.

Поэтому правильная запись: new point2 = Point(10, 20);
Re[4]: new для типов-значений
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.04.10 05:50
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Здравствуйте, ylem, Вы писали:


Y>>И после того, как вы "создадите новую" точку var point2 = new Point(10, 20); это будет все та же самая точка.

Y>>Все, что тут создается нового, это переменная, которая есть часть программы, но уж никак не часть мира точки.

Т>Поэтому правильная запись: new point2 = Point(10, 20);


Посмотрите на F#, только там let вместо new.
Re: new для типов-значений
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.04.10 05:51
Оценка:
Здравствуйте, ylem, Вы писали:

Y>У меня у одного вызывает диссонанс new для типов значений в C#?


Y>Ну сами по судите:


Y>var point = new Point(10, 20);


Y>Ну какая же она новая? Эта точка была за 500 лет до того, как я напечатал эту строчку и будет еще 500 лет (а то и дольше) после этого.

Y>Где я заблуждаюсь?

В выборе языка.

Смотри в сторону F#.
Re[2]: new для типов-значений
От: Воронков Василий Россия  
Дата: 08.04.10 10:47
Оценка:
Здравствуйте, 0x7be, Вы писали:

Y>>Где я заблуждаюсь?

0>У меня встречный вопрос: а зачем вообще ключевое слово "new" в C#? Понятно в С++ надо было разделять динамические и автоматические/статические объекты, для выделения динамических пришлось применять ключевое слово. Но в С#-то оно зачем?

Из соображений обратной совместимости с программистами, видимо. По факту оно не нужно вообще, но люди к этому привыкли и не припомню, чтобы кто-нибудь возмущался. А вот если бы new не было, то недовольные наверняка бы появились.

Вообще тут правильно ответили — есть другие языки.
Re[2]: new для типов-значений
От: WolfHound  
Дата: 08.04.10 13:36
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>В выборе языка.

G>Смотри в сторону F#.
Лучше немерле. В нем тоже new нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: new для типов-значений
От: . Великобритания  
Дата: 11.04.10 09:07
Оценка:
On 08/04/2010 09:28, Трурль wrote:

> Поэтому правильная запись: new point2 = Point(10, 20);

А чем такое заменить? "launchMissile(new Point(10,20))"?
Не надо путать создание объекта с объявлением переменной.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: new для типов-значений
От: ylem  
Дата: 11.04.10 10:52
Оценка:
>> Поэтому правильная запись: new point2 = Point(10, 20);
.>А чем такое заменить? "launchMissile(new Point(10,20))"?

launchMissile(new Point(10,20))
launchAnotherMissile(new Point(10,20))

А лупите при этом в ОДНУ И ТУ ЖЕ точку.
Re[6]: new для типов-значений
От: . Великобритания  
Дата: 11.04.10 11:58
Оценка:
Здравствуйте, ylem, Вы писали:

Y>launchMissile(new Point(10,20))

Y>launchAnotherMissile(new Point(10,20))

Y>А лупите при этом в ОДНУ И ТУ ЖЕ точку.

Это если immutable data. А в ООП есть состояние у объектов.
void launchMissile(Point p)
{
  p.killThemAll();
}
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: new для типов-значений
От: ylem  
Дата: 11.04.10 12:27
Оценка:
>Это если immutable data. А в ООП есть состояние у объектов.

У объектов -- да. У структур и прочих типов-значний нет смысла говорить про состояние.
Другое состояние -- другое значение.

.>
.>void launchMissile(Point p)
.>{
.>  p.killThemAll();
.>}
.>


Точка, это место на местности. Это даже не часть этой местности. Какие у нее KillThemAll ?

Но даже если следовать Вашему дизайну:
Второй снаряд, выпущенный по тем же координатам должен упасть на уже опустошенную местность.
И когда при целеуказании сказали new Point() там все осталось по-прежнему.
Re[8]: new для типов-значений
От: . Великобритания  
Дата: 11.04.10 13:06
Оценка:
On 11/04/2010 16:27, ylem wrote:

> У объектов -- да. У структур и прочих типов-значний нет смысла говорить

> про состояние.
Просто что принять за исходное. Если у объекта нет методов, которые могут изменить состояние, он и становится "прочим типом-значением". Не совсем очевидно, почему вдруг создание значения должно быть другим, не как у обычного объекта.

> Другое состояние -- другое значение.

Как посмотреть опять же. Объект зато тот же самый. Все, кто на него ссылался — будут ссылаться на это же значение.


> Точка, это место на местности. Это даже не часть этой местности. Какие у

> нее KillThemAll ?
Так смотря как определён объект Местность.

> Но даже если следовать Вашему дизайну:

> Второй снаряд, выпущенный по тем же координатам должен упасть на уже
> опустошенную местность.
> И когда при целеуказании сказали new Point() там все осталось по-прежнему.
В том-то и дело, что это уже семантика. ЯП это уже плохо выражает, как что должно оставаться или нет.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: new для типов-значений
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 27.04.10 11:04
Оценка: +1
Y>Где я заблуждаюсь?

Вот здесь.

Y>Ну какая же она новая? Эта точка была за 500 лет до того, как я напечатал эту строчку и будет еще 500 лет (а то и дольше) после этого.


Вы путаете понятие "точка" и "объект типа точка".

Точка действительно существовала за 500 лет до этого. А "объект типа точка" вы создаете конструкцией new, и он создается именно в тот момент, когда вы явно это определяете.

Таким образом строчку
var pt = new Point(5,5);

следует читать не как "создать новую точку с координатами 5,5" а как "создать новый объект типа "точка", который содержит координаты 5,5". И все встанет на свои места.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.