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

Reassign a variable a value in a foreach/for loop, and then use that value outside of the loop?

我想使用并显示在 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;
                }
            }
        }

    }

public int caesarEncryptText(string inputText, int encryptionNumberShift) 中声明的局部变量隐藏(使它们无法访问,除非使用 this 关键字访问)class 具有相同名称的字段。

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 '[=11=]'    

    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 '[=11=]'!!!!
} 

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

C# 遵循块作用域。同名变量 ctest2 也作为 class 的成员变量存在。在方法中使用相同的命名变量会完全创建新变量,并且在 class 级别声明的成员变量会被抑制。因此,在 caesarEncryptText 方法中对 ctest2 变量所做的任何更改都不会影响在 class 级别定义的成员变量。

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 ,它会改变你的成员变量。这是您理想情况下应该做的。 在 class 级别和方法级别具有相同的命名变量是脏代码
  2. 如果您想更改成员变量,请在方法中使用 this 关键字访问成员变量,如下所示:

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