Забавная задачка
От: Spi  
Дата: 29.10.08 09:24
Оценка:
Что выведет приведённый ниже код и почему?

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();
}
Re: Забавная задачка
От: ksg71 Германия  
Дата: 29.10.08 09:45
Оценка:
Здравствуйте, 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
Re: Забавная задачка
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 29.10.08 10:16
Оценка: 5 (2) +1
Здравствуйте, 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.

Re: Забавная задачка
От: Dr_Sh0ck Беларусь  
Дата: 29.10.08 11:44
Оценка:
Здравствуйте, Spi, Вы писали:

Spi>Что выведет приведённый ниже код и почему?


[skipped]

В таком виде даже не скомпилится
Do not fake yourself ;)
ICQ#: 198114726
Re: Забавная задачка
От: BAHEK  
Дата: 30.10.08 15:15
Оценка:
Давай посчитаем! Перед тем, как переменная используется, она обязательно инициализируется, если разработчик не инициализировал — переменная устанавливается в значение по умолчанию, т.е. для типа 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.