【问题标题】:Automatically updating variables with lambda使用 lambda 自动更新变量
【发布时间】:2019-10-28 14:00:02
【问题描述】:

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

我有使用lambda 自动更新变量b 的提示。

在此之后,我阅读了一篇关于使用 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的值。

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

【问题讨论】:

  • 不要让它们成为静态的......它们正在保持状态
  • 私有 int b = 0;私人int a;公共 int A { 得到 { 返回一个; } 设置 { a = 值; b++; } }

标签: c# variables lambda updates


【解决方案1】:

编辑 - 这既适用于直接更新 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);

【讨论】:

  • 谢谢 Rakesh,我需要将公式分配给与其相关的每个 get set 属性。
  • @Nate - 不确定我是否遵循,但如果您想使用公式,则使用显式属性,否则使用自动属性。我猜你在说同样的话:)
【解决方案2】:

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

当然,如前所述,我也建议您不要使用静态变量和 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;
}

【讨论】:

  • 谢谢 Athanasios Kataras,我需要将公式分配给与其相关的每个 get set 属性。
【解决方案3】:

这是班级应该是这样的:

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 赋值。

【讨论】:

  • 谢谢 Cyber​​Zeus,但是有一种繁琐的方法可以在公式所涉及的每个其他 get set 属性中分配公式。
猜你喜欢
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2011-08-23
  • 2013-03-19
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多