我正在遵循一个初学者的C#指南,该指南正在教如何使用公共方法。我对如何正确使用方法/功能了解得很少,如果这个问题很明显,请提前抱歉。我研究了很多问题,问了同样的事情,但找不到这种情况的答案。
该程序应采用字符串文本,将其发送给CheckDuplicate函数,并确定其是否包含多个相同的数字。如果是这样,它将返回字符串结果“ Duplicate”或“ No Duplicate”,然后在控制台上显示它。
现在,在CheckDuplicate函数下对字符串返回的引用具有错误“已分配变量,但从不使用其值”,并且在输入字符串时程序不会返回“ Duplicate”或“ No Duplicate”。
class Program
{
public static string result;
static void Main(string[] args)
{
Console.WriteLine("Enter several numbers separated by -");
string text = Console.ReadLine();
if (String.IsNullOrEmpty(text))
{
Console.WriteLine("Empty");
}
else
{
result = CheckDuplicate(text);
}
Console.WriteLine(result);
}
public static string CheckDuplicate(string text)
{
var textArray = text.Split('-');
int[] textArrayNum = textArray.Select(s => int.Parse(s)).ToArray();
if (textArrayNum.Length != textArrayNum.Distinct().Count())
{
string result = "Duplicate";
}
else
{
string result = "No Duplicate";
}
return result;
}
}
答案 0 :(得分:3)
您之所以陷入困境,是因为您有多个具有相同名称的变量,它们在范围上重叠。
最外部的范围是类级别,您在其中拥有static
字段result
。
然后您在result
中定义了另一个CheckDuplicate
,与上方的字段没有任何关系。更准确地说,您在该方法中具有三个不同的result
,两个在不同的if/else
语句中,一个在外部作用域中。
public static string CheckDuplicate(string text)
{
var textArray = text.Split('-');
int[] textArrayNum = textArray.Select(s => int.Parse(s)).ToArray();
if (textArrayNum.Length != textArrayNum.Distinct().Count())
{
string result = "Duplicate"; // most inner scope, hides the static field
}
else
{
// same level as before but completely unrelated to that one, also hides the static field
string result = "No Duplicate";
}
return result; // references the static field
}
无论如何,通过为变量使用有意义的名称,您可以轻松避免此类混淆。特别地,字段名称result
似乎很奇怪,因为它表明您整个 class 都有某种结果,该结果与众不同,因此应以IsDuplicate
之类的东西代替。另一方面,方法可能具有result
。话虽如此,通常最好是尽可能地限制变量的范围。
但是,在您的示例中,您甚至可以完全省略静态字段,因为您仅使用Main
中的return-value方法。只需使用局部变量并将其打印到控制台即可:
static void Main(string[] args)
{
...
var result = string.IsNullOrEmpty(text) ? "Empty" : CheckDuplicate(text);
Console.WriteLine(result);
}
使方法直接在if / else-blocks中返回也可以减少这种错误:
public static string CheckDuplicate(string text)
{
var textArray = text.Split('-');
int[] textArrayNum = textArray.Select(s => int.Parse(s)).ToArray();
if (textArrayNum.Length != textArrayNum.Distinct().Count())
{
return "Duplicate";
}
else
{
return "No Duplicate";
}
}