Вопрос по С#
3472
11
Решил на праздниках изучить С#. Вот читаю книгу и появляются вопросы. А спросить не у кого.

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

Т.е. если я в программе объявил 3 переменных целого, вещественного, булевского типа, то соответственно будут вызваны 6 конструкторов? (Целого, вещественно и булевского класса, а так же 3 раза конструктор System.Object). Это же неэффективно....
ИBАH
Не совсем так. Указанные Вами типы являются разновидностями типов-значений (value types), и соответственно, для работы с ними используются более эффективные операции. Соответственно, никаких конструкторов вызываться не будет, если только Вы сами вдруг почему-то такого не захотите.
Смысл процитированной Вами фразы состоит в том, что эти типы (классы) имеют, в частности, методы. Так, например, для преобразования текстовой записи числа в двоичную и обратно можно использовать что-то вроде:
int x = int.Parse(str);
str = x.ToString();
или даже:
str = 25.ToString();
wowik_2
И еще вдогонку. Если бы все же, как Вы предположили, для каждой переменной вызывались конструкторы, то конструкторы для System.Object все равно бы не вызывались. Ибо, в отличие от C++, конструкторы в C# не наследуются.
Кстати, если Вы уже знакомы с программированием, советую почитать: Трей Нэш, C# 2008: ускоренный курс для профессионалов.
wowik_2
Последнее предложение очень полезно! Большое спасибо! Сейчас поищу в инете книгу.
wowik_2
Если бы все же, как Вы предположили, для каждой переменной вызывались конструкторы, то конструкторы для System.Object все равно бы не вызывались. Ибо, в отличие от C++, конструкторы в C# не наследуются.
То, что конструкторы не наследуются не значит,
что можно создать объект наследуемого класса без выполнения конструктора базового класса.
Ananas
Возможно, не совсем точно выразился. Если в конструкторе производного класса не указан явно конструктор базового класса в формате base(...), то вызывается конструктор базового класса по умолчанию, что эквивалентно указанию base(). Однако для приведенных топикстартером типов базовым классом является object, в котором конструктор по умолчанию ничего не делает, и компилятор об этом обстоятельстве знает, и потому никакого вызова не генерирует.
wowik_2
базовым классом является object, в котором конструктор по умолчанию ничего не делает, и компилятор об этом обстоятельстве знает, и потому никакого вызова не генерирует.
что верно также для объектов of reference type?
Ananas
При чем тут reference type? Топикстартер упомянул целочисленный, вещественный и булевский типы.
wowik_2
При чем тут 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.
wowik_2
Однако для приведенных топикстартером типов базовым классом является object
для приведенных топикстартером типов непосредственным базовым классом является System.ValueType which inherits System.Object
Ananas
(всегда создаются объекты,
т.к. неззя их использовать, не инициализировав;
если явно не указывается их значение, то они инициализируются к default values с использованием default constructors).
Это верно для полей классов. Но для локальных переменных это не так. При создании без явного инициализатора они не обнуляются. Компилятор следит за этим и не позволяет к ним обращаться до первого присваивания либо до использования их в качестве out-параметра метода.
С остальным согласен, но я не вижу противоречий с тем, чт писал ранее.
wowik_2
И еще вдогонку. Если бы все же, как Вы предположили, для каждой переменной вызывались конструкторы, то конструкторы для System.Object все равно бы не вызывались. Ибо, в отличие от C++, конструкторы в C# не наследуются.
Кстати, если Вы уже знакомы с программированием, советую почитать: Трей Нэш, C# 2008: ускоренный курс для профессионалов.
Поддерживаю. Книга очень хороша, изложено лаконично и в то же время очень ёмко.