【问题标题】:how can I access values stored within a method from other places of a class [duplicate]如何从类的其他位置访问存储在方法中的值[重复]
【发布时间】:2019-12-04 16:59:58
【问题描述】:

在我当前的应用程序中,虽然我已经能够实现所需的逻辑,但当我试图从主方法中删除内容并从不同的方法中使用它时,我真的被卡住了。

我的代码如下,

class Program
    {
        const string path = @"filePath";
        static void Main(string[] args)
        {
            setUpValues();
        }
        private static void setUpValues()
        {
                var Content = JsonConvert.DeserializeObject<deploy>(File.ReadAllText(path));
                List<Variable> variables = Content.Variables.ToList();
                Scopes Scope = Content.ScopeValues;

                string Version = null;

                List<string> ListOfSelectedItems= new List<string>();
                List<string> TempListOfSelectedItems = new List<string>();
                List<string> Channels = new List<string>();

            foreach (var item in variables)
            {
                if (item.Name.Equals("version"))
                {
                    Version = item.Value;
                }
                if (item.Name.Equals("Selected"))
                {
                    TempListOfSelectedItems.Add(item.Value);
                }
            }

            Console.WriteLine("Version  " + Version);
            Console.WriteLine();

            string SelectedItems= TempListOfSelectedItems[0];
            ListOfSelectedItems = SelectedItems.Split(',').ToList();

            Console.WriteLine();
            Console.WriteLine("Selected Modules");
            Console.WriteLine();

            foreach (var item in ListOfSelectedItems)
            {
                Console.WriteLine(item);
            }

            foreach (var item in Scope.Channels)
            {
                Channels.Add(item.Name);
            }
        }
    }

我希望能够从该方法之外访问变量字符串 Version、ListOfSelectedItems 列表和频道列表。我也想在另一个中使用这些。那么我怎样才能使这些全球可访问? 非常感谢您的帮助,因为我被困在这里

【问题讨论】:

  • 使它们成为您班级的(静态)成员(如path,但不是const)。
  • 嗯,路径是一个常数,我想保持这种状态......知道如何访问 triring Version 、 ListOfSelectedItems 列表和频道列表吗? @RenéVogt
  • 喜欢Path,不代表改变路径。路径随处可访问,您想要随处可访问的东西,因此以路径为例说明您想要做什么。 (但正如 Rene 所说,用静态替换 const)

标签: c# .net variables methods


【解决方案1】:

为了在方法之外使用变量,您应该将它们声明为类的字段。像这样:

class Program
{
    const string path = @"filePath";
    static deploy Content;
    static string Version;
    static List<string> ListOfSelectedItems;
    static List<string> TempListOfSelectedItems;
    static List<string> Channels;
    // and others

    static void Main(string[] args)
    {
        setUpValues();
    }

    private static void setUpValues()
    {
        Content = JsonConvert.DeserializeObject<deploy>(File.ReadAllText(path));
        List<Variable> variables = Content.Variables.ToList();
        Scopes Scope = Content.ScopeValues;

        Version = null;

        ListOfSelectedItems = new List<string>();
        TempListOfSelectedItems = new List<string>();
        Channels = new List<string>();

        foreach (var item in variables)
        {
            if (item.Name.Equals("version"))
            {
                Version = item.Value;
            }

            if (item.Name.Equals("Selected"))
            {
                TempListOfSelectedItems.Add(item.Value);
            }
        }

        Console.WriteLine("Version  " + Version);
        Console.WriteLine();

        string SelectedItems = TempListOfSelectedItems[0];
        ListOfSelectedItems = SelectedItems.Split(',').ToList();

        Console.WriteLine();
        Console.WriteLine("Selected Modules");
        Console.WriteLine();

        foreach (var item in ListOfSelectedItems)
        {
            Console.WriteLine(item);
        }

        foreach (var item in Scope.Channels)
        {
            Channels.Add(item.Name);
        }
    }
}

您必须将这些字段声明为static,因为它们用于静态方法。 setUpValues 运行完成后,您也可以在 Main 方法中使用这些字段。

另外,这与问题无关,但 C# 中的一般代码约定是以大写字母开头的方法名称(因此 SetUpValues 而不是 setUpValues)并以局部变量的名称开头一个小写字母(selectedItems 而不是 SelectedItems)。显然,最终取决于您如何命名事物以及使用哪种代码约定。

【讨论】:

  • 您好,感谢您的回答。只是有一个小问题。在方法完成执行后,值再次为 null 。我在这里做错了吗?
  • 我想可能是因为你有静态字段,然后在方法中声明了同名的局部变量。不过,我不能确定,因为我看不到代码。例如,要使用字段而不是局部变量,您应该使用:ListOfSelectedItems = ... 而不是:List&lt;string&gt; ListOfSelectedItems = ...。当你写type name时,你创建了一个新变量,它可以和字段同名,但它是一个完全独立的东西。
【解决方案2】:

创建一个具有您想从其他地方访问的属性的类。在 setUpValues 中实例化这个类并返回它。

public class TestClass
{
    public TestClass()
    {
        this.ListOfSelectedItems = new List<string>();
    }
    public string Version { get; set; }
    public List<string> ListOfSelectedItems { get; set; }
}

然后将你的 Main 方法修改为:

    var myObj = setUpValues();

然后修改 setUpValues 以返回:

    private static TestClass setUpValues()
    {
        var Content = JsonConvert.DeserializeObject<deploy>(File.ReadAllText(path));
        List<Variable> variables = Content.Variables.ToList();
        Scopes Scope = Content.ScopeValues;

        string Version = null;

        List<string> ListOfSelectedItems = new List<string>();
        List<string> TempListOfSelectedItems = new List<string>();
        List<string> Channels = new List<string>();

        foreach (var item in variables)
        {
            if (item.Name.Equals("version"))
            {
                Version = item.Value;
            }
            if (item.Name.Equals("Selected"))
            {
                TempListOfSelectedItems.Add(item.Value);
            }
        }
        var retObj = new TestClass();
        Console.WriteLine("Version  " + Version);
        Console.WriteLine();
        retObj.Version = Version;
        string SelectedItems = TempListOfSelectedItems[0];
        ListOfSelectedItems = SelectedItems.Split(',').ToList();

        Console.WriteLine();
        Console.WriteLine("Selected Modules");
        Console.WriteLine();

        foreach (var item in ListOfSelectedItems)
        {
            Console.WriteLine(item);
            retObj.ListOfSelectedItems.Add(item);
        }

        foreach (var item in Scope.Channels)
        {
            Channels.Add(item.Name);
        }

        return retObj;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2018-07-05
    • 2018-12-15
    相关资源
    最近更新 更多