Что выведет приведённый ниже код и почему?
public class A
{
public static int x = B.y + 1;
}
public class B
{
public static int y = A.x + 1;
}
static void Main(string[] args)
{
Console.WriteLine("A.x = " + A.x);
Console.WriteLine("B.y = " + B.y);
Console.Read();
}
Здравствуйте, Spi, Вы писали:
Spi>Что выведет приведённый ниже код и почему?
Spi>Spi>public class A
Spi>{
Spi> public static int x = B.y + 1;
Spi>}
Spi>public class B
Spi>{
Spi> public static int y = A.x + 1;
Spi>}
Spi>static void Main(string[] args)
Spi>{
Spi> Console.WriteLine("A.x = " + A.x);
Spi> Console.WriteLine("B.y = " + B.y);
Spi> Console.Read();
Spi>}
Spi>
здесь описано разруливание
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Здравствуйте, Spi, Вы писали:
Spi>Что выведет приведённый ниже код и почему?
Spi>Spi>public class A
Spi>{
Spi> public static int x = B.y + 1;
Spi>}
Spi>public class B
Spi>{
Spi> public static int y = A.x + 1;
Spi>}
Spi>static void Main(string[] args)
Spi>{
Spi> Console.WriteLine("A.x = " + A.x);
Spi> Console.WriteLine("B.y = " + B.y);
Spi> Console.Read();
Spi>}
Spi>
A.x = 2
B.y = 1
10.5.5 Variable initializers
...
It is possible for static fields with variable initializers to be observed in their default value state. However, this is strongly discouraged as a matter of style.
The example
using System;
internal class Test
{
private static int a = b + 1;
private static int b = a + 1;
private static void Main()
{
Console.WriteLine("a = {0}, b = {1}", a, b);
}
}
exhibits this behavior. Despite the circular definitions of a and b, the program is valid. It results in the output a = 1, b = 2 because the static fields a and b are initialized to 0 (the default value for int) before their initializers are executed. When the initializer for a runs, the value of b is zero, and so a is initialized to 1. When the initializer for b runs, the value of a is already 1, and so b is initialized to 2.
Здравствуйте, Spi, Вы писали:
Spi>Что выведет приведённый ниже код и почему?
[skipped]
В таком виде даже не скомпилится
Давай посчитаем! Перед тем, как переменная используется, она обязательно инициализируется, если разработчик не инициализировал — переменная устанавливается в значение по умолчанию, т.е. для типа int в нуль.
Имеем:
Вы проинициализировали статическую переменную A.x, прибавив к переменной B.y еденицу, т.е
A.x = B.y + 1 = (A.x(здесь переменная равна 0,т.к. еще не инициализирована) + 1) + 1 = (0 + 1) + 1 = 2
А вот интересно здесь то, что при вызове конструктора по умолчанию для класса А и расчета значения переменной х, был автоматически вызван конструктов для класса В, потому как востребовалась переменная у. Сначала посчиталось значение переменной у(оно равно 1), а затем х(равно2).
И все это происходит при вызове метода Console.WriteLine("A.x = " + A.x);
При втором вызове Console.WriteLine происходит просто считывание у.
Хотя я могу и ошибаться, пользовался дебагером, надо ILDAsm-ом
А вообще пример похож на видоизмененный х = х + 1