Модераторы: 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   Вверх
diadiavova
Дата 19.6.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Любитель @  19.6.2009,  11:48 Найти цитируемый пост)
Я хотел убрать неясности.

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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