在 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;
不过你还有另外两个问题。
datacollected
(在 test
class 中)不是 static
。您的所有方法都是 static
,因此无法访问 non-static 成员。
- 您仍然遇到
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 第一个数据对象的数据收集字符串 属性 .
我需要从一个 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;
不过你还有另外两个问题。
datacollected
(在test
class 中)不是static
。您的所有方法都是static
,因此无法访问 non-static 成员。- 您仍然遇到
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 第一个数据对象的数据收集字符串 属性 .