我想使用并显示在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;
}
}
}
}
答案 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#遵循块范围。同名的变量c
和test2
也作为您班级的成员变量出现。在方法中使用相同的命名变量会完全创建新变量,并且在类级别声明的成员变量会被抑制。因此,对c
方法中的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
}
}
}
要实际更改成员变量,您有两种方法:
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
}