【问题标题】:C# WinForms - Code works before array, but when placed after array it failsC# WinForms - 代码在数组之前工作,但放在数组之后会失败
【发布时间】:2021-05-28 03:40:05
【问题描述】:

我正在尝试使用以下代码将一段文本附加到 RichTextBox Form2.codeOutput.Text += "test"; 当放置在我的数组之前时效果很好(像这样):

public static void newString(string curLine)
        {
            Form2.codeOutput.Text += "test";

            string[] parsedString = new string[3];
            parsedString[0] = "string";
            parsedString[1] = curLine.Substring(7, 12);
            parsedString[2] = curLine.Substring(23, curLine.Length);
        }

但是,当我将它放在我的数组之后时,它不起作用:

public static void newString(string curLine)
        {
            string[] parsedString = new string[3];
            parsedString[0] = "string";
            parsedString[1] = curLine.Substring(7, 12);
            parsedString[2] = curLine.Substring(23, curLine.Length);

            Form2.codeOutput.Text += "test";
        }

我尝试寻找解决方案,但没有得到任何好的结果;任何帮助将不胜感激。

编辑 1:我应该补充一点,当代码不起作用时,它不会给出错误或崩溃或任何东西;文本根本不会出现在富文本框中。

编辑 2:我尝试了相同的方法,只是将 Form2.codeOutput.Text += "test"; 替换为 Debug.WriteLine("test");,同样的问题;代码放在数组之前而不是之后时有效。

【问题讨论】:

  • 您是否遇到过任何异常?看起来这可能是这里发生的事情.. 在您的方法内的第一行放置一个断点并逐步执行它,看看会发生什么
  • 您的 subStringMethod 存在一些问题,您可以通过将 Debug.WriteLine("") 放在每个数组元素分配下方来解决此问题。调试这段代码时发生了什么?
  • @psj01@Biju Kalanjoor 我发现了问题,前两个工作正常,但第三个给出“System.ArgumentOutOfRangeException”
  • 尝试添加 curLine = "abcdefghijklmnopqrstuvwxyz1234567890";是您的 newString 方法的第一条语句。如果这工作正常,下一步您将更改 curLine 参数中的值。并快速查看每个 subString 语句
  • @BijuKalanjoor 我试过了,但是我得到了 System.ArgumentOutOfRangeException。我不知道为什么,因为 curLine 有 36 个字符长。

标签: c# .net winforms


【解决方案1】:

试试这个

public static void Main()
{
    string value="abcdefghijklmnopqrstuvwxyz1234567890";
    newString(value);
}

public static void newString(string curLine)
{
     string[] parsedString = new string[3];
     parsedString[0] = "string";
     parsedString[1] = curLine.Substring(7, 12);
     Console.WriteLine(parsedString[1]);
     parsedString[2] = curLine.Substring(23); // Changes here
     Console.WriteLine(parsedString[2]);

     Console.WriteLine("Done");
     //Form2.codeOutput.Text += "test";
}

检查数组中的值。

此方法可能在两种情况下引发 ArgumentOutOfRangeException:

如果参数 startIndex 或 length 小于零。 如果 startIndex + length 表示的位置不在当前实例内。

【讨论】:

  • 这里重要的一点是curLine.Substring(23),因为第二个参数是子字符串的长度,而不是最后一个索引。
【解决方案2】:

你传递给方法的“curLine”的值是什么? 如果 startIndex 小于零或大于此实例的长度,则 Substring 将抛出 ArgumentOutOfRangeException

【讨论】:

  • curLine 是“abcdefghijklmnopqrstuvwxyz1234567890”——它只是我用来测试东西的占位符值。
  • parsedString[2] = curLine.Substring(23, curLine.Length) 改为parsedString[2] = curLine.Substring(23, curLine.Length - 1);
【解决方案3】:

好的,这很有趣。容易小便。首先要做的事:总是从文档开始!!

其次,子字符串的第二个参数是请求的子字符串的长度,而不是所需的最后一个索引。做curLine.Substring(23, curLine.Length - 23);,你应该会很好。现在你告诉 substring 从索引 23 开始并给你下一个 curLine.length 个字符。显然这失败了,因为它不是 23 + curLine.length 个字符长。

来自文档@https://docs.microsoft.com/en-us/dotnet/api/system.string.substring?view=net-5.0#System_String_Substring_System_Int32_System_Int32_

Substring(Int32, Int32)
Retrieves a substring from this instance. The substring starts at a specified character position and has a specified length.

public string Substring (int startIndex, int length);

Parameters:
startIndex
Int32
The zero-based starting character position of a substring in this instance.

length
Int32
The number of characters in the substring.

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2017-10-13
    相关资源
    最近更新 更多