5°C
завтра: 1°C
Погода в Перми
5°C
вечером2°C
ночью−1°C
завтра1°C
Подробно
 63,76
−0.1936
Курс USD ЦБ РФна 22 октября
63,7606
−0.1936
 71,17
+0.0397
Курс EUR ЦБ РФна 22 октября
71,1696
+0.0397
  • Решил на праздниках изучить С#. Вот читаю книгу и появляются вопросы. А спросить не у кого.

    Цитата из книги:
    В языке С# устранена разница между переменными и объектами. Все переменные в С# -- тоже объекты, которые имеют единого предка -- класс System.Object

    Т.е. если я в программе объявил 3 переменных целого, вещественного, булевского типа, то соответственно будут вызваны 6 конструкторов? (Целого, вещественно и булевского класса, а так же 3 раза конструктор System.Object). Это же неэффективно....

  • Не совсем так. Указанные Вами типы являются разновидностями типов-значений (value types), и соответственно, для работы с ними используются более эффективные операции. Соответственно, никаких конструкторов вызываться не будет, если только Вы сами вдруг почему-то такого не захотите.
    Смысл процитированной Вами фразы состоит в том, что эти типы (классы) имеют, в частности, методы. Так, например, для преобразования текстовой записи числа в двоичную и обратно можно использовать что-то вроде:
    int x = int.Parse(str);
    str = x.ToString();
    или даже:
    str = 25.ToString();

  • И еще вдогонку. Если бы все же, как Вы предположили, для каждой переменной вызывались конструкторы, то конструкторы для System.Object все равно бы не вызывались. Ибо, в отличие от C++, конструкторы в C# не наследуются.
    Кстати, если Вы уже знакомы с программированием, советую почитать: Трей Нэш, C# 2008: ускоренный курс для профессионалов.

  • Последнее предложение очень полезно! Большое спасибо! Сейчас поищу в инете книгу.

  • В ответ на: Если бы все же, как Вы предположили, для каждой переменной вызывались конструкторы, то конструкторы для System.Object все равно бы не вызывались. Ибо, в отличие от C++, конструкторы в C# не наследуются.
    То, что конструкторы не наследуются не значит,
    что можно создать объект наследуемого класса без выполнения конструктора базового класса.

  • Возможно, не совсем точно выразился. Если в конструкторе производного класса не указан явно конструктор базового класса в формате base(...), то вызывается конструктор базового класса по умолчанию, что эквивалентно указанию base(). Однако для приведенных топикстартером типов базовым классом является object, в котором конструктор по умолчанию ничего не делает, и компилятор об этом обстоятельстве знает, и потому никакого вызова не генерирует.

  • В ответ на: базовым классом является object, в котором конструктор по умолчанию ничего не делает, и компилятор об этом обстоятельстве знает, и потому никакого вызова не генерирует.
    что верно также для объектов of reference type?

  • При чем тут reference type? Топикстартер упомянул целочисленный, вещественный и булевский типы.

  • В ответ на: При чем тут reference type? Топикстартер упомянул целочисленный, вещественный и булевский типы.
    Вы объяснили всё с точностью до наоборот.
    ТС спросил будут ли вызываться конструкторы при использовании переменных, содержащие объекты value type.
    В отличие от [переменных, содержащих] reference type objects:
    Да, всегда, т.к. [переменные, содержащие] value type objects, не могут иметь null
    (всегда создаются объекты,
    т.к. неззя их использовать, не инициализировав;
    если явно не указывается их значение, то они инициализируются к default values с использованием default constructors).
    Более того, в отличие от reference type variables,
    ихиспользование
    (присвоение или передача, в качестве параметров) всегда приводит к созданию копий объектов и вызову (по крайней мере default) конструкторов!

    То, что Вы попытались объяснить никак не относится эксклюзивно к value types:
    не объясняет ни их отличий,
    ни почему они более "эффективны"
    (тем более, что не были упомянуты stack и heap).
    Более того, то, что Вы объясняли "указывало" на их
    (переменные с value type objects)
    "недостатки" по сравнению с reference type variables.

  • В ответ на: Однако для приведенных топикстартером типов базовым классом является object
    для приведенных топикстартером типов непосредственным базовым классом является System.ValueType which inherits System.Object

  • В ответ на: (всегда создаются объекты,
    т.к. неззя их использовать, не инициализировав;
    если явно не указывается их значение, то они инициализируются к default values с использованием default constructors).
    Это верно для полей классов. Но для локальных переменных это не так. При создании без явного инициализатора они не обнуляются. Компилятор следит за этим и не позволяет к ним обращаться до первого присваивания либо до использования их в качестве out-параметра метода.
    С остальным согласен, но я не вижу противоречий с тем, чт писал ранее.

  • В ответ на: И еще вдогонку. Если бы все же, как Вы предположили, для каждой переменной вызывались конструкторы, то конструкторы для System.Object все равно бы не вызывались. Ибо, в отличие от C++, конструкторы в C# не наследуются.
    Кстати, если Вы уже знакомы с программированием, советую почитать: Трей Нэш, C# 2008: ускоренный курс для профессионалов.
    Поддерживаю. Книга очень хороша, изложено лаконично и в то же время очень ёмко.

Записей на странице:

Перейти в форум

Модератор: