Member 14719149 Ответов: 2

Пожалуйста, объясните, как работает этот звонок в отель


Вот выдержка из кода:
using System;

<pre>
namespace ConsoleApp2
{
    class Program
    {


        class A
        {
            int Fa = 1 ;

            public A() { ++Fa; }

            public int f { get { return ++Fa; } set { Fa += value; } }
        }
        class B : A
        {
            static int Fb = 2 ;
            public B() { Fb++; base.f = 2; }
            public new int f { get{ return Fb++ ;}  set { Fb += value ;} }
                public override string ToString() { return String.Format("{0}", base.f + f); }
        }
            static void Main()
            {
            B obj1 = new B(), obj2 = new B(), obj3 = new B();
            obj3.f=obj2.f ;
            Console.Write(obj1);
            Console.Write(obj1);
            Console.Write(obj1);
            }
        
    }
}


Я не могу понять, что происходит в строке obj3.f=obj2.f

Что я уже пробовал:

Я предположил, что obj2.f вызывает get свойства f, затем выполняется набор и после этого значение набора становится значением в obj3.f, но это не соответствует правильному ответу.

phil.o

Геттер, который изменяет значение, которое он должен вернуть, имеет сильный запах дефекта дизайна.

Richard Deeming

Возможно, ваше замешательство связано с тем, что вы пишете obj1 к пульту три раза? Я подозреваю, что вы хотите написать все три объекта вместо этого.

Но, как сказал Фил, собственность get который изменяет значение-это "запах кода".

Member 14719149

Ну, это просто тестовое задание, которое я получил однажды, и оно, конечно, "вонючее" и не имеет никакого практического применения, но код написан здесь так, как задумал его автор.

2 Ответов

Рейтинг:
1

OriginalGriff

По сути, то, что вы сделали, - это преступление против природы, и вы вообще не должны этого делать. Добытчики собственности никогда не должны изменять значения; когда они делают это, вещи становятся очень, очень странными, особенно когда static переменные задействованы, и код становится чрезвычайно трудным для отладки, потому что отладчик использует геттеры для извлечения значений, которые он отображает для вас - поэтому значения, которые вы видите в отладчике, могут соответствовать или не соответствовать тому, что вы ожидаете, и ваш акт записи значений в консоль вызывает изменение других значений (включая то, которое вы показываете).

В принципе, не делайте этого. Добытчики свойств никогда не должны изменять данные, это крайне плохая практика и приводит к непредсказуемым результатам, как вы уже видели.


Member 14719149

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

Рейтинг:
0

phil.o

Поставьте точку останова на первой строке таблицы. Main() метод, затем нажмите клавишу F5 (при условии, что вы используете Visual Studio) и запустите сеанс отладки. Оттуда вы сможете выполнять код строка за строкой, изучая значения ваших переменных по пути.
Вам нужна помощь в том, как провести сеанс отладки?


OriginalGriff

Это не поможет; это сделает его еще хуже - отладчик использует геттер свойств для отображения значений, поэтому небрежное наведение мыши на код во время точки останова изменит значения, которые он отображает... Xo

ZurdoDev

Если вы войдете в код геттера, это поможет.

OriginalGriff

Я бы не стал полагаться на это - это может стать еще более запутанным, поскольку метод, в который вы вступаете, будет использовать тот же метод для отображения значений отладки ... Вероятно, вам будет лучше использовать Debug.WriteLine и snapshotting значения для последующего просмотра. Геттеры, которые изменяют значения, - это Пита для сортировки.