2017-07-27 14 views
1

foreachループで使用されているcの値(test2という名前の変数を割り当てた値)を使用して表示しますが、foreachループの外で使用すると変数はnull値を表示します。 test2またはcの値にはどうすればアクセスできますか?私はc/test2の値をある時点でリストに追加しようとしましたが、そのリストの値を文字列として表示することはできませんでした。 public int caesarEncryptText(string inputText, int encryptionNumberShift)皮革(thisキーワードでアクセスしない限り、それらにアクセスできなくなり)同じ名前のクラスフィールドで宣言さ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もクラスのメンバー変数として存在します。メソッド内で同じ名前付き変数を使用すると、新しい変数がすべて作成され、クラスレベルで宣言されたメンバー変数が抑制されます。したがって、とtest2の変数のうち、caesarEncryptTextメソッド内の変数を変更しても、クラスレベルで定義されているメンバー変数には影響しません。

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にアクセスする方法をtheresの? –

+0

@ColtonSkeesはクラスのフィールドにアクセスするために 'this'キーワードを使います。 –

+0

@EmrahSüngüfor.textまたはthis.cの値をforループから調べても、引き続きヌル値が表示されます。 –

0

ローカル変数。あなたは多分、後は何

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(); 
    } 
} 
関連する問題