调用公共函数时,如何解决“变量已赋值但从未使用过其值”错误?

时间:2018-10-01 20:20:32

标签: c#

我正在遵循一个初学者的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;
    }
}

1 个答案:

答案 0 :(得分:3)

您之所以陷入困境,是因为您有多个具有相同名称的变量,它们在范围上重叠。

  1. 最外部的范围是类级别,您在其中拥有static字段result

  2. 然后您在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";
    }
}