我是 C# 新手,无法理解变量的范围。我在课程开始时声明了一个数组:
namespace TextProcessing
{
public static class Program
{
private static string[] ForewordArray;
Run Code Online (Sandbox Code Playgroud)
然后在 Main 中,我初始化并填充数组:
public static void Main(string[] args)
{
try
{
try
{
//snip - XML source is opened - snip
foreword = XMLnav.SelectSingleNode("//iso:foreword", NSmgr);
forewordText = foreword.InnerXml;
ForewordTextP = (forewordText.Length - forewordText.Replace("<p", string.Empty).Length) / 2 + 1;
CurrFPos = 1;
LastFPos = 1;
string[] ForewordArray = new string[ForewordTextP];
for (var z = 0; z <= ForewordTextP - 1; z++)
{
LastFPos = CurrFPos;
if (z < ForewordTextP - 1)
{
CurrFPos = Strings.InStr(LastFPos, forewordText, "<p");
if (LastFPos > 1)
{
ForewordArray[z] = Strings.Left(Strings.Mid(forewordText, LastFPos - 1), CurrFPos - LastFPos - 1);
}
else
{
ForewordArray[z] = Strings.Left(Strings.Mid(forewordText, LastFPos), CurrFPos - LastFPos - 1);
}
CurrFPos = CurrFPos + 1;
}
else
{
CurrFPos = Strings.InStr(LastFPos, forewordText, "p>");
ForewordArray[z] = Strings.Left(Strings.Mid(forewordText, LastFPos-1), CurrFPos - LastFPos + 3);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在其他一些文本处理之后,当执行返回到数组时(仍在 Main 中!),它为空:
foreach (var bkmkStart in wordDoc.MainDocumentPart.RootElement.Descendants<BookmarkStart>())
{
if (bkmkStart.Name == "ForewordText")
{
forewordbkmkParent = bkmkStart.Parent;
for (var y = 0; y <= ForewordArray.Length - 1; y++)
{
var TextProcessP = new Para2XML(ForewordArray[y]);
forewordbkmkParent.InsertBeforeSelf(TextProcessP.PReturn);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为我在 Try 循环中初始化数组吗?我已经阅读了几十页关于 C# 中变量作用域的内容,但我仍然没有明白。感谢您的任何阅读建议。
小智 5
您在 Main 中声明了一个新的本地数组,并且正在使用数据对其进行初始化。看起来第二个代码块正在访问从未初始化的类级别数组。
在 Main 中,以下行声明了一个名为 ForewordArray 的新字符串数组,因为您以该类型开始这一行。
string[] ForewordArray = new string[ForewordTextP];
Run Code Online (Sandbox Code Playgroud)
为了初始化您在类顶部声明的数组,这应该如下所示:
ForewordArray = new string[ForewordTextP];
Run Code Online (Sandbox Code Playgroud)