Автоматическое обновление переменных с помощью лямбды - PullRequest
1 голос
/ 28 октября 2019

У меня была проблема, и я обратился к сообществу с просьбой помочь мне в ее решении. Проблема заключается в автоматическом обновлении всех переменных при изменении переменной.

У меня есть советы по использованию lambda для автоматического обновления переменной b.

* 1007. * После этого я прочитал пост об использовании get & set. Тем не менее, даже когда я делаю что-то подобное ниже, переменная b не будет обновляться.
private static int b;
        public int B
        {
            get { return b; }
            set { b = a + 5; }
        }

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

class Class3
{
public class Storage
    {
        public static int a = 100;
        //public static int b => a + 5;
        public static int b => a + 5;
        public static int c;
    }
public static void Main()
    {
        Methods Test = new Methods();
        Console.WriteLine("Original a value: {0}", Storage.a);
        Console.WriteLine("b value: {0}", Storage.b);
        Console.WriteLine("c value: {0}", Storage.c);
        Test.Met1();
        Console.WriteLine("After met1: {0}", Storage.a);
        Console.WriteLine("b value: {0}", Storage.b);
        Console.WriteLine("c value: {0}", Storage.c);
        Test.Met2();
        Console.WriteLine("After met2: {0}", Storage.a);
        Console.WriteLine("b value: {0}", Storage.b);
        Console.WriteLine("c value: {0}", Storage.c);
        Test.Met3();
        Console.WriteLine("After met3: {0}", Storage.a);
        Console.WriteLine("b value: {0}", Storage.b);
        Console.WriteLine("c value: {0}", Storage.c);

        Storage.b += 1;
        Console.WriteLine("b value: {0}", Storage.b);

    }
    public class Methods
    {
        public void Met1()
        {
            Storage.a -= 10;
            Storage.c = Storage.a;
        }
        public void Met2()
        {
            Storage.a -= 10;
            Storage.c = Storage.a;
        }
        public void Met3()
        {
            Console.WriteLine("{0}", Storage.a);
            Storage.c = Storage.a;
            Met1();
            Met2();
            if (Storage.a > 10)
            {
                Met3();
            }
        }
    }
}

Я хотел бы видеть, что b обновляется каждый раз, когда a меняет значение. Кроме того, код должен позволять Storage.b += 1; обновить значение b.

Есть ли способ обойти это? Мне действительно нужна помощь с этим. Если есть ссылка, которую я мог бы прочитать, поделитесь ею со мной. Спасибо!

Ответы [ 3 ]

1 голос
/ 28 октября 2019

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

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

public static class Storage
{
    private static int a = 100;
    public static int A {
        get { return a; }
        set { a = value; b = a + 5; }
    }

    private static int b = a + 5;
    public static int B {
        get { return b; }
        set { b = value; }
    }
    public static int c;
}
1 голос
/ 28 октября 2019

Редактировать - это работает как для непосредственного обновления значения B, так и для обновления его при изменении значения A.

Я изменил классы Storage и Methods

        public class Storage
        {
            private int _a;

            public int A
            {
                get { return _a; }
                set
                {
                    _a = value;
                    B = value + 5;
                }
            }
            public int B { get; set; }
            public int C { get; set; }

            public Storage()
            {
                A = 100;
            }
        }

       public class Methods
        {
            private Storage _storage;

            public Methods(Storage storage)
            {
                _storage = storage;
            }
            public void Met1()
            {
                _storage.A -= 10;
                _storage.C = _storage.A;
            }
            public void Met2()
            {
                _storage.A -= 10;
                _storage.C = _storage.A;
            }
            public void Met3()
            {
                Console.WriteLine("{0}", _storage.A);
                _storage.C = _storage.A;
                Met1();
                Met2();
                if (_storage.A > 10)
                {
                    Met3();
                }
            }
        }

Внутри Main

            var storage = new Storage();
            Methods Test = new Methods(storage);
            Console.WriteLine("Original a value: {0}", storage.A);
            Console.WriteLine("b value: {0}", storage.B);
            Console.WriteLine("c value: {0}", storage.C);
            Test.Met1();
            Console.WriteLine("After met1: {0}", storage.A);
            Console.WriteLine("b value: {0}", storage.B);
            Console.WriteLine("c value: {0}", storage.C);
            Test.Met2();
            Console.WriteLine("After met2: {0}", storage.A);
            Console.WriteLine("b value: {0}", storage.B);
            Console.WriteLine("c value: {0}", storage.C);
            Test.Met3();
            Console.WriteLine("After met3: {0}", storage.A);
            Console.WriteLine("b value: {0}", storage.B);
            Console.WriteLine("c value: {0}", storage.C);

            storage.B += 1;
            Console.WriteLine("b value: {0}", storage.B);

Output from the program

0 голосов
/ 28 октября 2019

Вот как должен быть класс:

public class Storage
{
    public int a { get; set; }
    public int b => a + 5;
    public int c { get; set; }

    public void Met1()
    {
        this.a -= 10;
        this.c = this.a;
    }

    public void Met2()
    {
        this.a -= 10;
        this.c = this.a;
    }

    public void Met3()
    {
        Console.WriteLine("{0}", this.a);
        this.c = this.a;
        Met1();
        Met2();
        if (this.a > 10)
        {
            Met3();
        }
    }
}

Вот как вы можете его использовать:

    static void Main(string[] args)
    {
        Storage storage = new Storage();
        storage.a = 100;
        Console.WriteLine("Original a value: {0}", storage.a);
        Console.WriteLine("b value: {0}", storage.b);
        Console.WriteLine("c value: {0}", storage.c);
        storage.Met1();
        Console.WriteLine("After met1: {0}", storage.a);
        Console.WriteLine("b value: {0}", storage.b);
        Console.WriteLine("c value: {0}", storage.c);
        storage.Met2();
        Console.WriteLine("After met2: {0}", storage.a);
        Console.WriteLine("b value: {0}", storage.b);
        Console.WriteLine("c value: {0}", storage.c);
        storage.Met3();
        Console.WriteLine("After met3: {0}", storage.a);
        Console.WriteLine("b value: {0}", storage.b);
        Console.WriteLine("c value: {0}", storage.c);

        Console.ReadKey();
        //storage.b += 1;
        //Console.WriteLine("b value: {0}", storage.b);
    }

Обратите внимание, что если b равно + 5Вы не можете присвоить значение b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...