Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исходник кода в книге верный или нет? не стыкуется с тем, что успел прочитать 
:(
    Опции темы
Gunslinger
Дата 18.6.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Сейчас читаю Бишопа, Хорспула "С# в кратком изложении".Либо ошибка, либо я не понимаю следующий участок кода:
Код

using System; 
class TimeDifference { 

   void Go () {
    Console.WriteLine("The Time Difference Program"); 
    DateTime now=DateTime.Now; //---1 опечатка?
    DateTime endOfYear = new DateTime(now.Year, 12, 31); 
    Console.WriteLine(endOfYear) ; 
    Console.WriteLine(now); 
    Console.WriteLine ("Days till the end of the year are "); 
    Console.WriteLine((endOfYear - now).Days); //--2 непонятка
   } 
    static void Main() { 
       new TimeDifference().Go(); //--3 непонятка
   }
}

Экземпляра создается через new, в DateTime now=DateTime.Now; этого нет. Если это не опечатка, а взможность сокращения кода, то такое присвоение взможно для переменной, чтобы отдельно сохранить текущую дату-время, но результат ложится не в переменную, а в объект. Или у объекта DateTime перегружен оператор "="?
О непонятках 2 и 3 вообще ничего сказать не могу.
PM MAIL   Вверх
DVariuS
Дата 18.6.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 5
Всего: 8



Код

DateTime now=DateTime.Now; //---1 опечатка?

Не опечатка, а обращение к статическому свойству класса DateTime. Т.е. создается новый экземпляр класса DateTime с именем now и ему присваивается значение статического свойства Now.

Код

Console.WriteLine((endOfYear - now).Days); //--2 непонятка

аналогично
Код

TimeStamp remainingTime = endOfYear - now;
Console.WriteLine(remainingTime.Days);


Код

new TimeDifference().Go(); //--3 непонятка

Что-то вроде анонимного объекта. Т.е объект создается, но имя ему не присваивается.
PM MAIL   Вверх
Gunslinger
Дата 18.6.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(DVariuS @  18.6.2009,  16:39 Найти цитируемый пост)

Не опечатка, а обращение к статическому свойству класса DateTime. Т.е. создается новый экземпляр класса DateTime с именем now и ему присваивается значение статического свойства Now.

значит = в DateTime все-таки перегружено.

Цитата(DVariuS @  18.6.2009,  16:39 Найти цитируемый пост)

Код

Console.WriteLine((endOfYear - now).Days); //--2 непонятка


аналогично. 

Код

TimeStamp remainingTime = endOfYear - now;
Console.WriteLine(remainingTime.Days);


Не знал, что так можно сокращать. Получается, компилятор создает вроде временного объекта? 

Цитата(DVariuS @  18.6.2009,  16:39 Найти цитируемый пост)

Код

new TimeDifference().Go(); //--3 непонятка

Что-то вроде анонимного объекта. Т.е объект создается, но имя ему не присваивается. 

Про анонимные объекты тоже не знал. Этот код в книге не разобран. Может структура такая - потом будут объяснять.

PM MAIL   Вверх
DVariuS
Дата 18.6.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 5
Всего: 8



Цитата(Gunslinger @  18.6.2009,  16:57 Найти цитируемый пост)
значит = в DateTime все-таки перегружено.

Нет. DateTime - структура, т.е. значимый тип, для него не нужно переопределять оператор присваивания.


Цитата(Gunslinger @  18.6.2009,  16:57 Найти цитируемый пост)
Не знал, что так можно сокращать. Получается, компилятор создает вроде временного объекта? 

2 и 3 участки кода в этом похожи - просто используются анонимные объекты (еще бывают анонимные методы и даже анонимные типы данных).
PM MAIL   Вверх
mihryak
Дата 18.6.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(DVariuS @  18.6.2009,  18:17 Найти цитируемый пост)
Цитата(Gunslinger @  18.6.2009,  16:57 Найти цитируемый пост)
значит = в DateTime все-таки перегружено.

Нет. DateTime - структура, т.е. значимый тип, для него не нужно переопределять оператор присваивания.


а что, для ссылочного типа как-то по-другому будет?
Код

AppDomain currentDomain = AppDomain.CurrenDomain;
WebRequest request = WebRequest.Create("http://msdn.com");


вся штука тут в том, что new вызывается, но неявно для пользователя класса (при инициализации, при вызове метода, при вызове get-свойства, как в случае DateTime)
PM MAIL ICQ   Вверх
Любитель
Дата 19.6.2009, 06:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(mihryak @  18.6.2009,  22:13 Найти цитируемый пост)
AppDomain currentDomain = AppDomain.CurrenDomain;

Новый объект здесь не создаётся.


--------------------
PM MAIL ICQ Skype   Вверх
mihryak
Дата 19.6.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(Любитель @  19.6.2009,  07:15 Найти цитируемый пост)
Новый объект здесь не создаётся. 

а кто сказал, что он новый? я лишь написал, что он когда-то был создан неявно для пользователя
Цитата(mihryak @  18.6.2009,  23:13 Найти цитируемый пост)
при инициализации


PM MAIL ICQ   Вверх
Любитель
Дата 19.6.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(mihryak @  18.6.2009,  22:13 Найти цитируемый пост)
вся штука тут в том, что new вызывается, но неявно для пользователя класса

Во втором случае (типичная фабрика) - да он вызывается, в первом - просто присваивании. Объект существовал задолго до этого.


--------------------
PM MAIL ICQ Skype   Вверх
Gunslinger
Дата 19.6.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Вроде бы в C# классы создавать можно только так:
Код

type myOdj=new type;

а не как в C++:
Код

type myObj;

Но в следующем коде так:
Код

  DateTime now=DateTime.Now;
  DateTime endOfYear = new DateTime(now.Year, 12, 31); 

т.е. в первой строке мы now присваиваем результат статического метода DateTime.Now (кстати, если это метод, то где скобки после, или это тоже синтаксис C#?), при этом не создавая экземпляр самого класса. Нет new - это значит анонимный объект? Ведь экземпляр можно создать только через него.
Затем иницализируем новый экземпляр значением now.Year. Т.е. метод Now возвращает и время, и год.
И еще. Почему DateTime структура? У нее есть же Now, Year (в терминологии С++: у структур не может быть методов, хотя мы в универе писали именно такsmile).


Это сообщение отредактировал(а) Gunslinger - 19.6.2009, 10:19
PM MAIL   Вверх
DVariuS
Дата 19.6.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 5
Всего: 8



Цитата(Gunslinger @  19.6.2009,  10:16 Найти цитируемый пост)
кстати, если это метод, то где скобки после, или это тоже синтаксис C#?

Я же написал выше, что это не метод, а свойство.
Цитата(Gunslinger @  19.6.2009,  10:16 Найти цитируемый пост)
И еще. Почему DateTime структура? У нее есть же Now, Year (в терминологии С++: у структур не может быть методов, хотя мы в универе писали именно так)

У структур могут быть методы(в т.ч. и конструкторы). 
PM MAIL   Вверх
Gunslinger
Дата 19.6.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(DVariuS @  19.6.2009,  10:22 Найти цитируемый пост)
Я же написал выше, что это не метод, а свойство.

посмотрел определение свойства - вопрос снят. Значит структуры - как обычные типы, new не нужно.
PM MAIL   Вверх
mihryak
Дата 19.6.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(Любитель @  19.6.2009,  10:39 Найти цитируемый пост)
Во втором случае (типичная фабрика) - да он вызывается, в первом - просто присваивании. Объект существовал задолго до этого. 

да, блин, что за желание докопаться? я прекрасно знаю, что он был существовал задолго до этого
но ведь он тоже когда-то был создан, не правда ли? или это расчудесная магия от дот-нета?

Цитата(mihryak @  19.6.2009,  09:41 Найти цитируемый пост)
он когда-то был создан неявно для пользователя

когда-то - это значит когда-то, совсем не обязательно в момент вызова

о чём спорим вообще?
PM MAIL ICQ   Вверх
Любитель
Дата 19.6.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



mihryak, давай не ссориться - никто никого обижать не собирался smile 

Просто ты немного противоречишь сам себе. Ну или неточно выражаешься:

Цитата(mihryak @  19.6.2009,  10:31 Найти цитируемый пост)
да, блин, что за желание докопаться? я прекрасно знаю, что он был существовал задолго до этого


А затем (смотрим на текст в скобках):
Цитата(mihryak @  18.6.2009,  22:13 Найти цитируемый пост)
вся штука тут в том, что new вызывается, но неявно для пользователя класса (при инициализации, при вызове метода, при вызове get-свойства, как в случае DateTime) 


Я хотел убрать неясности.

Цитата(Gunslinger @  19.6.2009,  10:16 Найти цитируемый пост)
Вроде бы в C# классы создавать можно только так:

Во-первых, не так (скобки пропущены - это не С++). Во-вторых, DateTime это структура.

Цитата(Gunslinger @  19.6.2009,  10:16 Найти цитируемый пост)
Т.е. метод Now возвращает и время, и год.

Свойство Now возвращает объект типа DateTime.

Цитата(Gunslinger @  19.6.2009,  10:16 Найти цитируемый пост)
И еще. Почему DateTime структура? У нее есть же Now, Year (в терминологии С++: у структур не может быть методов, хотя мы в универе писали именно так

В С++ - структура отличается от класса дефолтным модификатором доступа (public вместо protected). В C# - тем, что структура - это value-тип, класс - reference (читаем основы языка C#).


--------------------
PM MAIL ICQ Skype   Вверх
mihryak
Дата 19.6.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(Любитель @  19.6.2009,  12:48 Найти цитируемый пост)
Просто ты немного противоречишь сам себе. Ну или неточно выражаешься:

я не вижу противоречий vOv и неточностей тоже, возможно, неясно выражаюсь - с этим не спорю
Цитата(mihryak @  18.6.2009,  23:13 Найти цитируемый пост)
new вызывается, но неявно для пользователя класса (при инициализации, при вызове метода, при вызове get-свойства, как в случае DateTime) 

в скобках указан открытый список моментов времени, в которые происходит создание объекта, их больше, конечно же, но речь не о том
в случае AppDomain инстанс создаётся при инициализации класса (тут вообще пользователь не при чём), что вполне попадает под первый пункт перечисления
эти два примера я и привёл, что бы все эти пункты были с примерами
инициализация - AppDomain, метод - WebRequest, св-во - DateTime

Это сообщение отредактировал(а) mihryak - 19.6.2009, 14:34
PM MAIL ICQ   Вверх
Любитель
Дата 19.6.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(mihryak @  19.6.2009,  14:25 Найти цитируемый пост)
в скобках указан открытый список моментов времени, в которые происходит создание объекта, их больше, конечно же, но речь не о том
в случае AppDomain инстанс создаётся при инициализации класса (тут вообще пользователь не при чём), что вполне попадает под первый пункт перечисления
эти два примера я и привёл, что бы все эти пункты были с примерами
инициализация - AppDomain, метод - WebRequest, св-во - DateTime

Ну, строго говоря создание экземпляра класса происходит только с помощью new, а уж где new вызывается - это другой вопрос.

Ладно - не стоит эта тема столь рьяного обсуждения smile 


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.