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