Неточности стандарта C# или я опять чего-то непонимаю?
От: BokiyIS  
Дата: 12.07.08 22:49
Оценка:
Во время чтения "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.


Однако касательно статических перенных это не есть правда, ведь (http://www.rsdn.ru/forum/message/1195767.1.aspx):
Автор: Chupa_Kabra
Дата: 30.05.05

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".
Подскажите пожалуйста, может я где-то что-то не так понял.
inheritance static constructor
Re: Неточности стандарта C# или я опять чего-то непонимаю?
От: BokiyIS  
Дата: 12.07.08 23:17
Оценка:
Извините, второй вопрос по невнимательности накатал. Пора спать уже, а то я форум ерундой начинаю наводнять
Re: Неточности стандарта C# или я опять чего-то непонимаю?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.07.08 08:29
Оценка:
Здравствуйте, BokiyIS, Вы писали:

BIS>Однако касательно статических перенных это не есть правда,


В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать.

BIS>Хотя после прочтения стандарта кажется, что каждый наследуемый тип должен иметь свою статическую переменную _str


Не совсем понятно, откуда такой вывод.

BIS>Проверяем:
BIS>  private static string Init()
BIS>  {
BIS>    return ">> Init";
BIS>  }


Надо так:


private static string Init()
{
    Console.WriteLine(">> Init");
    return ">> Init";
}
Re[2]: Неточности стандарта C# или я опять чего-то непонимаю
От: BokiyIS  
Дата: 13.07.08 09:33
Оценка:
Здравствуйте, nikov, Вы писали:

N>В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать.


Спасибо за ответ. Как-то не так представлял себе наследование между объектами-типами.

З.Ы. Второй вопрос — это не вопрос, это невнимательность
Re[2]: Неточности стандарта C# или я опять чего-то непонимаю
От: tyger Россия  
Дата: 15.07.08 10:10
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, BokiyIS, Вы писали:


BIS>>Однако касательно статических перенных это не есть правда,


N>В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать.

Исходя из чего?
Что тогда лежит в основе CLR?
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
Re[3]: Неточности стандарта C# или я опять чего-то непонимаю
От: nikov США http://www.linkedin.com/in/nikov
Дата: 15.07.08 10:16
Оценка:
Здравствуйте, tyger, Вы писали:

N>>В CLR статические поля не наследуются, а в C# — наследуются. Соответственно, компилятору C# приходится это эмулировать.

T>Исходя из чего?

Можно сказать, что стандарт CLR здесь руководствуется простотой и удобством реализации, а C# вводит дополнительный уровень абстракции.

T>Что тогда лежит в основе CLR?


Не понял вопрос.
Re[2]: Неточности стандарта C# или я опять чего-то непонимаю
От: BokiyIS  
Дата: 15.07.08 10:21
Оценка:
А можно ли назавть такое поведение наследованием, ведь когда создается новый экземпляр объекта, ему выделяется память как для его полей, так и для полей родителей. Логично было бы предположить, что при наследовании, наследующий тип получает память для хранения полей родительского типа (т.е. статических переменных).
Re[4]: Неточности стандарта C# или я опять чего-то непонимаю
От: tyger Россия  
Дата: 15.07.08 10:26
Оценка:
Здравствуйте, 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# или я опять чего-то непонимаю
От: nikov США http://www.linkedin.com/in/nikov
Дата: 15.07.08 10:42
Оценка:
Здравствуйте, tyger, Вы писали:

T>Я имею в виду на что опираются/опирались при создании CLR? для C# есть спецификация, которая будет утверждается (если еще нет) ECMA, а для CLR что?

T>Исходя из чего можно судить что CLR делает то-то и не умеет того-то, кроме как на основе анализа генерируемого MSIL?

Ну как же, есть ведь Ecma-335
Re[3]: Неточности стандарта C# или я опять чего-то непонимаю
От: Mikluho Россия  
Дата: 15.07.08 10:44
Оценка:
Здравствуйте, BokiyIS, Вы писали:

BIS>А можно ли назавть такое поведение наследованием, ведь когда создается новый экземпляр объекта, ему выделяется память как для его полей, так и для полей родителей. Логично было бы предположить, что при наследовании, наследующий тип получает память для хранения полей родительского типа (т.е. статических переменных).


а может Вы не правильно понимаете суть статических членов класса? Статический — значит один на весть тип. И статический метод и любая статическая переменная существует в одном экземпляре — в том типе, где определена. Наследовать ее никак нельзя, ведь любой наследник — это уже другой тип.
И он может либо использовать статический мембер родителя или описать свой собственный.
Re[4]: Неточности стандарта C# или я опять чего-то непонимаю
От: BokiyIS  
Дата: 15.07.08 10:51
Оценка:
Здравствуйте, Mikluho, Вы писали:

M>а может Вы не правильно понимаете суть статических членов класса? Статический — значит один на весть тип. И статический метод и любая статическая переменная существует в одном экземпляре — в том типе, где определена. Наследовать ее никак нельзя, ведь любой наследник — это уже другой тип.

M>И он может либо использовать статический мембер родителя или описать свой собственный.

То что стат. переменные находятся в типе я прекрасно понимаю, просто мне, почему-то, кажется, что наследник (другой тип) должен получить стат. переменные родителя. Бзик у меня какой-то. Спасибо за ответы.
Re[5]: Неточности стандарта C# или я опять чего-то непонимаю
От: Mikluho Россия  
Дата: 15.07.08 12:38
Оценка:
Здравствуйте, BokiyIS, Вы писали:

BIS>Здравствуйте, Mikluho, Вы писали:


M>>а может Вы не правильно понимаете суть статических членов класса? Статический — значит один на весть тип. И статический метод и любая статическая переменная существует в одном экземпляре — в том типе, где определена. Наследовать ее никак нельзя, ведь любой наследник — это уже другой тип.

M>>И он может либо использовать статический мембер родителя или описать свой собственный.

BIS>То что стат. переменные находятся в типе я прекрасно понимаю, просто мне, почему-то, кажется, что наследник (другой тип) должен получить стат. переменные родителя. Бзик у меня какой-то. Спасибо за ответы.


дык в том-то и дело, что статическая переменная существует в одном экземпляре типа. вообще. их нельзя никому передать
Re[6]: Неточности стандарта C# или я опять чего-то непонимаю
От: BokiyIS  
Дата: 15.07.08 12:55
Оценка:
M>дык в том-то и дело, что статическая переменная существует в одном экземпляре типа. вообще. их нельзя никому передать

я все прекрасно понимаю, просто мне это давно казалось неинтуитивным. Я понимаю, что когда кажется... вот и говорю — бзик
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.