在foreach/for循环中重新分配一个变量值,然后在循环外部使用该值?
问题描述:
我想使用和显示在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;
}
}
}
}
答
C#如下块作用域。同名变量c
和test2
也作为您班级的成员变量存在。在方法中使用相同的命名变量会完全创建新变量,并且会在类级别声明的成员变量被取消。因此,对caesarEncryptText
方法内的c
和test2
变量所做的任何更改都不会影响在类级别定义的成员变量。
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
}
}
}
要真正改变成员变量,而不是你有两种方式:
- 不要声明
test2
变量的本地方法内。然后,如果您在方法内更改了test2
,它将更改您的成员变量。这是你理想中应该做的。 在类级别和方法级别具有相同的命名变量是脏代码。 -
访问使用你的方法里面
this
关键字,如果你想改变的成员变量,而不是如下面所示的成员变量:foreach (char c in inputText.ToString().ToCharArray()) { //other code //using this keyword will modify your member variable this.test2 = c; //remaining code }
答
在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();
}
}
所以世界上没有其他办法foreach循环的外部访问C 2 –
@ColtonSkees使用'this'关键字来访问一个类的字段。 –
@EmrahSüngü在for循环中检查this.text或this.c的值仍然显示空值。 –