【问题标题】:C# array available outside function函数外部可用的 C# 数组
【发布时间】:2020-04-18 23:15:05
【问题描述】:
  private void frmExecute_Load(object sender, EventArgs e)
    {
        string[] data = File.ReadAllLines("c:\\toyotoconsole\\tssetup.txt");

        // Loop through each line, split, add if server
        for (int i = 0; i < data.Length; i++)
        {
                var serverValues = data[i].Split('|');
        }
    }

好的,第一个 C# windows 项目,这很酷,因为除了奇怪的调试之外,我从未真正接触过它。

我的问题是数组serverValues 是内置在一个函数中的,我如何使这个数组所有函数都可用(不确定是否在这里使用了正确的术语) 在相同的形式脚本中(也可能是错误的单词)。有public 声明吗?

【问题讨论】:

  • 局部变量 serverValues 变成一个字段:在外面声明:private string[] serverValues = null; ... private void frmExecute_Load(object sender, EventArgs e) {...serverValues = data[i].Split('|');...}
  • 即使你把它作为一个局部变量,变量每次都会覆盖,所以最后你的serverValues将只包含data[data.length - 1].Split('|')的值

标签: c# arrays public


【解决方案1】:

从技术上讲,您应该将本地变量 serverValues 转换为字段(或属性):

  private string[] serverValues = new string[0];

  private void frmExecute_Load(object sender, EventArgs e) {
    ...
    serverValues = data[i].Split('|'); 
    ...
  } 

然而,正如大家所见,你在循环中重写 serverValues;这就是为什么serverValues 将包含仅拆分的 last 行。另一个问题是混合业务逻辑 (ServerValues) 和UI(表单加载)。

看来你想要这样的东西:

using System.Linq;

...

private string[] m_ServerValues = null;

// Pure buiness logic: ServerValues without any UI (form)
public string[] ServerValues {
  get { 
    // If we have the array we return it
    if (m_ServerValues != null)
      return m_ServerValues;

    // otherwise we compute it
    m_ServerValues = File
      .ReadLines("c:\\toyotoconsole\\tssetup.txt")
      .SelectMany(line => line.Split('|'))
      .ToArray();

    // And return it
    return m_ServerValues;
  } 
}

// UI: form loading
private void frmExecute_Load(object sender, EventArgs e) {
  // If you want to prefetch (it's not necessary)
  var values = ServerValues;
} 

【讨论】:

    【解决方案2】:
    // Declare a private property in you class 
    private serverValues = Array.Empty<string>();
    

    然后在任何事件中使用

    private void frmExecute_Load(object sender, EventArgs e)
    {
        string[] data = File.ReadAllLines("c:\\toyotoconsole\\tssetup.txt");
    
        // Loop through each line, split, add if server
        for (int i = 0; i < data.Length; i++)
        {
            serverValues = data[i].Split('|');
        }
    }
    

    【讨论】:

    • private string[] severValues = new string[0];: 错字(severValues 的类型)
    • 感谢@DmitryBychenko,支持您的详细回答
    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多