使用 lambda 自动更新变量

Automatically updating variables with lambda

我遇到了问题,我已请求社区帮助我解决问题。问题是在修改变量时自动更新所有变量。

我有使用 自动更新变量 b 的技巧。

在此之后,我阅读了 post 说明如何使用 get & set。但是,即使我在下面执行类似的操作,变量 b 也不会更新。

private static int b;
        public int B
        {
            get { return b; }
            set { b = a + 5; }
        }

我也找不到使用 lambda 的方法并将它们组合在一起。下面是我用来测试的代码。

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.

的值

有没有办法解决这个问题?我真的需要帮助。如果有 link 我可以阅读,请与我分享。谢谢!

class 应该是这样的:

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 等于 a + 5,则不能为 b 赋值。

也许这样的事情对你有用。您只需要使用属性并隐藏成员变量。

当然,如前所述,我也建议您不要使用静态变量和getter。

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;
}

编辑 - 这既适用于直接更新 B 的值,也适用于在 A 的值更改时更新它。

我修改了StorageMethods

        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);