【问题标题】:C# novice question about modifying outside variables inside a method关于修改方法内部的外部变量的C#新手问题
【发布时间】:2020-03-24 04:03:07
【问题描述】:

在下面的示例中,我想知道一种使底部示例功能与顶部示例相同的好方法。我知道范围是底部示例不起作用的原因。

我有兴趣这样做,这样我就可以整理我的程序的主体并消除一些重复的代码。

namespace example_1
{
    class Program
    {
        static void Main(string[] args)
        {
            int test = 5;
            bool trigger = true;
            if (trigger)
            {
                test++;
                trigger = false;
            }
        }
    }
}
namespace example_2
{
    class Program
    {
        static void Main(string[] args)
        {
            int test = 5;
            bool trigger = true;
            if (trigger)
            {
                mod_test();
            }
        }
        public static void mod_test()
        {
            test++;
            trigger = false;
        }
    }

【问题讨论】:

  • 您是否考虑过使用 instance 变量而不是局部变量?如果您有很多状态,通常最好通过将其设置为对象的状态而不是方法的状态来处理。您可以使用 ref 参数来让示例 2 正常工作,但我怀疑这并不是解决更大问题的最佳方法。
  • 我是新手,我需要可以自己编译和测试的示例代码。

标签: c# variables methods


【解决方案1】:

你可以在方法之外声明属性,但仍然在类中:

class Program
{
    // both of them are accessible within the class scope, but not outside
    static int test = 5;
    static bool trigger = true;

    static void Main(string[] args)
    {
        if (trigger)
        {
            mod_test();
        }
    }

    public static void mod_test()
    {
        test++;
        trigger = false;
    }
}

【讨论】:

  • 或者他可以将变量传递给子函数,但我认为这是一个更好的方法来处理这个例子
  • @Gerrit 确实如此,但需要ref。如果越来越多的方法需要它们,那可能会很痛苦
  • 这将一个问题换成了另一个问题。我想在保持现有功能的同时获得在方法中修改这些变量的能力。
  • @nosirrahx 好吧,你可以
  • @nosirrahx 你忘记使用static 关键字了吗?
【解决方案2】:

我认为在这种情况下使用数据容器对象更合适。例如,在以下示例中,我将intbool 变量包装到TestDataclass 中。这样您就不必使用全局变量,并且仍然可以传递对象引用以进行任何类型的操作。

namespace example_3
{
    class TestData
    {
        public bool Trigger { get; set; }
        public int Test { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var testData = new TestData
            {
                Test = 5,
                Trigger = true
            };

            if (testData.Trigger)
            {
                mod_test(testData);
            }
        }

        public static void mod_test(TestData data)
        {
            data.Test++;
            data.Trigger = false;
        }
    }
}

【讨论】:

  • 这确实有效,这似乎也是完成我想要的一种相对简洁的方式。谢谢:)
  • 虽然在这个阶段您可能需要考虑将mod_test 方法(重命名为更惯用的方法之后)作为instance 方法放入TestData。与其将类视为一个状态桶,不如尝试考虑哪些操作对它有意义。
  • @JonSkeet 我完全同意。但是,这需要了解上下文。
  • @HossainMuctadir:当然可以,但我认为这至少可以将 OP 引导到那个方向。
  • 一般来说,我只是在寻找一种方法,将大量的主应用代码块移动到一个孤立的位置,同时为该功能赋予一个人类可读的名称。在大多数情况下,我使用传统的方法/函数,但有时我需要一个方法/函数来更改某些外部变量的状态,这可以让我这样做。在 20 年没有编码之后,我在 C# 上学习了 2 周,我知道我还有很多东西要学,而且 C# 与我很久以前使用的有点不同。
猜你喜欢
  • 2016-05-23
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多