在 C# 中将方法的返回值设置为 public 字符串

Set returned value from method as public string in C#

我需要从一个 class 获取字符串到另一个 class, 可以从方法中设置 public 字符串,我的意思是在这段代码中:

class test
{
        static void Main(string[] args)
        {
            load();
        }

        public class Data
        {
            public string datacollected { get; set; }
        }

        public static void load()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);
            Data datacfg = new Data();

            var datanew = System.Text.Json.JsonSerializer.Deserialize<List<Data>>(jsonString);
            datacfg = datanew.First();
        }

        public string datacollected = datacfg.datacollected;


}

我想在另一个 class 和另一个 public void

中使用字符串 datacollected

直接在 test class 中的 datacollected 成员不是 属性。这是一个领域。在与声明相同的语句上具有赋值的字段在 class 的构造函数之前进行评估(即:在 Main 方法运行之前)。

您可能希望它成为 属性,每次您访问该成员时都会对其进行评估。 最简单的 修复方法是在等号后添加 >

public string datacollected => datacfg.datacollected;

不过你还有另外两个问题。

  1. datacollected(在 test class 中)不是 static。您的所有方法都是 static,因此无法访问 non-static 成员。
  2. 您仍然遇到 datacfg 是在 load 方法中定义的 local 变量的问题。您不能在其定义的范围之外使用变量。

方案一:只需要调用load.

方法中的解析文件数据

load更改为return解析后的数据,而不是将其保存到class-global变量中。

using System.Text.Json;
static class test
{
        static void Main(string[] args)
        {
            Data loadedData = load();
        }

        public static Data load()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);
            return JsonSerializer.Deserialize<List<Data>>(jsonString).First();
        }
}

public class Data
{
    public string datacollected { get; set; }
}

选项 2:如果您确实 需要一些全局变量,请将整个 Data 对象放到一个字段中。这不使用 属性 - 在这种情况下确实没有优势。

using System.Text.Json;
static class test
{
        // assuming you're using nullable reference types (the "?")
        private static Data? loadedData;

        static void Main(string[] args)
        {
            load();
            Console.WriteLine(loadedData!.datacollected);
            // "!" to tell compiler that you know loadedData 
            // shouldn't be null when executed
        }

        public static void load()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);
            loadedData = JsonSerializer.Deserialize<List<Data>>(jsonString).First();
        }
}

public class Data
{
    public string datacollected { get; set; }
}

如果可能的话,我会选择选项 1。


*不记得是之前,期间,还是之后了

你可以像这样声明一个class

    public class UseData
    {
        private List<Data> _data=null;

        public string datacollected
        {
            get
            {
                if (_data == null)
                    LoadData();
                return _data.First().datacollected;
            }
        }

        private void LoadData()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);

            _data = System.Text.Json.JsonSerializer.Deserialize<List<Data>>(jsonString);
        }
    }

它有一个私人数据列表,它会在您第一次调用时从您的 json 文件加载。下次你调用它时,当私有 _data 对象被填充时,它不会再次加载并且 datacollected 属性 returns 第一个数据对象的数据收集字符串 属性 .