2017-07-27 219 views
1

我想使用和显示在foreach循环中使用的c的值(我将一个名为test2的变量赋值给),但是当在foreach循环之外使用时,变量显示为空值。我如何访问test2或c的值?我尝试将c/test2的值附加到列表的某个点上,但无法管理将该列表的值作为字符串显示。在foreach/for循环中重新分配一个变量值,然后在循环外部使用该值?

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; 
       } 
      } 
     } 

    } 

回答

0

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

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 
    } 
    
+0

所以世界上没有其他办法foreach循环的外部访问C 2 –

+0

@ColtonSkees使用'this'关键字来访问一个类的字段。 –

+0

@EmrahSüngü在for循环中检查this.text或this.c的值仍然显示空值。 –

0

public int caesarEncryptText(string inputText, int encryptionNumberShift)皮声明的局部变量(使他们无法进入,除非有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(); 
    } 
}