将变量重新赋值为foreach / for循环中的值,然后在循环外使用该值?

时间:2017-07-27 02:12:03

标签: c# .net .net-4.6

我想使用并显示在foreach循环中使用的c的值(我指定了一个名为test2的变量),但是当在foreach循环外部使用时,变量显示空值。如何访问test2或c的值?我试图在一个点上将c / test2的值附加到列表中,但无法将该列表的值显示为字符串。

class encryptionFunctionClass
{

    List<string> textConvertedToArray = new List<string>();
    List<string> charToMessageBox = new List<string>();
    string inputText;
    string inputTextToChar;
    char test1; // Poor Naming Conventions Ik.
    char test2; // Poor Naming Conventions Ik.
    bool isReturn = false;
    bool isNotReturn = true;
    int test3;
    char c;

    public int caesarEncryptText(string inputText, int encryptionNumberShift)
    {
        textConvertedToArray.Add(inputText);
        foreach (char c in inputText.ToString().ToCharArray())
        {
            int i = 0;
            char test2 = c;
            test1 = test2;
            if ((char)c + encryptionNumberShift >= 24)
            {
                isReturn = true;

                test2 = c;
                charToMessageBox.Add(c.ToString());

            }
            else
            {
                isNotReturn = true;
                test2 = c;
                charToMessageBox.Add(c.ToString());
            }

        }
           while(true)

           MessageBox.Show(test2.ToString());

            if(isReturn == true)
            {
                return (char)c - (int)26;
            }
            else
            {
                if(isNotReturn == true)
                {

                    return (char) + (int)24;
                }
            }
        }

    }

2 个答案:

答案 0 :(得分:0)

this中声明的局部变量隐藏(除非使用private string inputText; //←Hidden by the caesarEncryptText Method's variable `inputText` private string inputTextToChar; private char test1; // Poor Naming Conventions Ik. private char test2; //←Hidden by the caesarEncryptText Method's foreach loop private bool isReturn = false; private bool isNotReturn = true; private int test3; private char c; //←Hidden by the caesarEncryptText Method's foreach loop 关键字访问,否则无法访问它们)具有相同名称的类字段。

public class EncryptionFunctionClass {

    private char c; //Default value of '\0'    

    public char ShadowingExample(string inputText, int encryptionNumberShift) {
    foreach (var c in inputText) {
        //Play with `c` here will not affect private char c declared above.
        var anotherChar = (char)(c + 24);//Etc..
    }
    return c;←Still '\0'!!!!
} 

    public string CaesarEncryptText(string inputText, int encryptionNumberShift) {
        var sb = new StringBuilder();
        foreach (var c in inputText) { sb.Append((char)(c + encryptionNumberShift)); }
        return sb.ToString();
    }
}

你想要的是这样的事情:

string folder = textBox1.Text;
string[] xlsxfiles = Directory.GetFiles(folder, "*.xlsx");
Excel.Application app = new Excel.Application();
app.Visible = true;
Excel.Workbook finalWB = app.Workbooks.Add("");
Excel.Workbook tempWB = app.Workbooks.Add(xlsxfiles);
for (int i = 2; i <= app.Workbooks.Count; i++)
{
    for (int j = 1; j <= app.Workbooks[i].Worksheets.Count; j++)
    {
        Excel.Worksheet ws = app.Workbooks[i].Worksheets[j];
        ws.Copy(app.Workbooks[1].Worksheets[1]);
    }
}

答案 1 :(得分:0)

C#遵循块范围。同名的变量ctest2也作为您班级的成员变量出现。在方法中使用相同的命名变量会完全创建新变量,并且在类级别声明的成员变量会被抑制。因此,对c方法中的test2caesarEncryptText变量所做的任何更改都不会对在类级别定义的成员变量产生影响。

class encryptionFunctionClass
{
    char test2; // Poor Naming Conventions Ik.
    char c;

    public int caesarEncryptText(string inputText, int encryptionNumberShift)
    {
        textConvertedToArray.Add(inputText);
        foreach (char c in inputText.ToString().ToCharArray())
        {
            //other code
            //this test2 variable is NOT your member variable
            char test2 = c;
            //remaining code
        }
     }
}

要实际更改成员变量,您有两种方法:

  1. 不要在方法中本地声明test2变量。然后,如果您在方法中更改test2,它将更改您的成员变量。这是理想情况下应该做的事情。 在类级别和方法级别具有相同的命名变量是脏代码
  2. 如果要更改成员变量,请使用方法中的this关键字访问成员变量,如下所示:

    foreach (char c in inputText.ToString().ToCharArray())
    {
        //other code
        //using this keyword will modify your member variable
    
        this.test2 = c;
    
        //remaining code
    }