Во время чтения "C# Language Specification Version 3.0" смутила пара моментов:
1) В стандарте написано:
10.3.3 Inheritance
A class inherits the members of its direct base class type. Inheritance means that a class implicitly contains all members of its direct base class type, except for the instance constructors, destructors and static constructors of the base class.
class Program
{
static void Main(string[] args)
{
Console.WriteLine(B._str);
}
}
class A
{
public static string _str = "test";
}
class B: A {}
заменится компилятором на:
Console.WriteLine(A._str);
Хотя после прочтения стандарта кажется, что каждый наследуемый тип должен иметь свою статическую переменную _str
2) В стандарте написано:
10.12 Static constructors
...
The execution of a static constructor is triggered by the first of the following events to occur within an application domain:
• An instance of the class type is created. • Any of the static members of the class type are referenced.
Проверяем:
public class A
{
public static string str = Init();
public static void Yell()
{
Console.WriteLine(">> Yell");
}
private static string Init()
{
return">> Init";
}
static A()
{
}
}
public class EntryPoint
{
static void Main()
{
A.Yell();
}
}
Вывод программы:
>> Yell
И никаких ">> Init".
Подскажите пожалуйста, может я где-то что-то не так понял.
Здравствуйте, BokiyIS, Вы писали:
BIS>Однако касательно статических перенных это не есть правда,
В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать.
BIS>Хотя после прочтения стандарта кажется, что каждый наследуемый тип должен иметь свою статическую переменную _str
Не совсем понятно, откуда такой вывод.
BIS>Проверяем:
Здравствуйте, nikov, Вы писали:
N>В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать.
Спасибо за ответ. Как-то не так представлял себе наследование между объектами-типами.
З.Ы. Второй вопрос — это не вопрос, это невнимательность
Re[2]: Неточности стандарта C# или я опять чего-то непонимаю
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, BokiyIS, Вы писали:
BIS>>Однако касательно статических перенных это не есть правда,
N>В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать.
Исходя из чего?
Что тогда лежит в основе CLR?
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
Re[3]: Неточности стандарта C# или я опять чего-то непонимаю
Здравствуйте, tyger, Вы писали:
N>>В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать. T>Исходя из чего?
Можно сказать, что стандарт CLR здесь руководствуется простотой и удобством реализации, а C# вводит дополнительный уровень абстракции.
T>Что тогда лежит в основе CLR?
Не понял вопрос.
Re[2]: Неточности стандарта C# или я опять чего-то непонимаю
А можно ли назавть такое поведение наследованием, ведь когда создается новый экземпляр объекта, ему выделяется память как для его полей, так и для полей родителей. Логично было бы предположить, что при наследовании, наследующий тип получает память для хранения полей родительского типа (т.е. статических переменных).
Re[4]: Неточности стандарта C# или я опять чего-то непонимаю
Здравствуйте, nikov, Вы писали:
T>>Что тогда лежит в основе CLR?
N>Не понял вопрос.
Я имею в виду на что опираются/опирались при создании CLR? для C# есть спецификация, которая будет утверждается (если еще нет) ECMA, а для CLR что?
Исходя из чего можно судить что CLR делает то-то и не умеет того-то, кроме как на основе анализа генерируемого MSIL?
P.S. Ох и не легкая же работа получается у создателей всяческих клонов Microsoft'овской .NET...
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
Re[5]: Неточности стандарта C# или я опять чего-то непонимаю
Здравствуйте, tyger, Вы писали:
T>Я имею в виду на что опираются/опирались при создании CLR? для C# есть спецификация, которая будет утверждается (если еще нет) ECMA, а для CLR что? T>Исходя из чего можно судить что CLR делает то-то и не умеет того-то, кроме как на основе анализа генерируемого MSIL?
Здравствуйте, BokiyIS, Вы писали:
BIS>А можно ли назавть такое поведение наследованием, ведь когда создается новый экземпляр объекта, ему выделяется память как для его полей, так и для полей родителей. Логично было бы предположить, что при наследовании, наследующий тип получает память для хранения полей родительского типа (т.е. статических переменных).
а может Вы не правильно понимаете суть статических членов класса? Статический — значит один на весть тип. И статический метод и любая статическая переменная существует в одном экземпляре — в том типе, где определена. Наследовать ее никак нельзя, ведь любой наследник — это уже другой тип.
И он может либо использовать статический мембер родителя или описать свой собственный.
Re[4]: Неточности стандарта C# или я опять чего-то непонимаю
Здравствуйте, Mikluho, Вы писали:
M>а может Вы не правильно понимаете суть статических членов класса? Статический — значит один на весть тип. И статический метод и любая статическая переменная существует в одном экземпляре — в том типе, где определена. Наследовать ее никак нельзя, ведь любой наследник — это уже другой тип. M>И он может либо использовать статический мембер родителя или описать свой собственный.
То что стат. переменные находятся в типе я прекрасно понимаю, просто мне, почему-то, кажется, что наследник (другой тип) должен получить стат. переменные родителя. Бзик у меня какой-то. Спасибо за ответы.
Re[5]: Неточности стандарта C# или я опять чего-то непонимаю
Здравствуйте, BokiyIS, Вы писали:
BIS>Здравствуйте, Mikluho, Вы писали:
M>>а может Вы не правильно понимаете суть статических членов класса? Статический — значит один на весть тип. И статический метод и любая статическая переменная существует в одном экземпляре — в том типе, где определена. Наследовать ее никак нельзя, ведь любой наследник — это уже другой тип. M>>И он может либо использовать статический мембер родителя или описать свой собственный.
BIS>То что стат. переменные находятся в типе я прекрасно понимаю, просто мне, почему-то, кажется, что наследник (другой тип) должен получить стат. переменные родителя. Бзик у меня какой-то. Спасибо за ответы.
дык в том-то и дело, что статическая переменная существует в одном экземпляре типа. вообще. их нельзя никому передать
Re[6]: Неточности стандарта C# или я опять чего-то непонимаю