我的子程序不会调用我需要的值

时间:2016-12-09 11:11:34

标签: c# console-application subroutine

我有2个子程序,这样它们就可以让两个不同的玩家找到一个名字,但是当我在主要的地方打电话时,它说一个参数1必须通过一个' ref'关键字,但我不是已经这样做了吗?

static string GetPlayer1(ref string name1)
{
    Console.WriteLine("PlayerX enter your name:");
    name1 = Console.ReadLine();
    return name1;
}

static string GetPlayer2(ref string name2)
{
    Console.WriteLine("PlayerO enter your name:");
    name2 = Console.ReadLine();
    return name2;
}

static void Main(string[] args)
{
    string name1 = GetPlayer1(name1);
    string name2 = GetPlayer2(name2); 
...

3 个答案:

答案 0 :(得分:4)

此处方法参数中的ref不需要,实际上您甚至不需要参数。将其更改为:

static string GetPlayer1()
{
    Console.WriteLine("PlayerX enter your name:");
    return Console.ReadLine();
}

static string GetPlayer2()
{
    Console.WriteLine("PlayerO enter your name:");
    return Console.ReadLine();
}

static void Main(string[] args)
{
    string name1 = GetPlayer1();
    string name2 = GetPlayer2();
}


但是,如果您的意图使用ref(作为示例或练习),那么这将是如何做到的。这些方法现在没有返回类型(void而不是string),因为文本是通过赋值给ref参数返回的。

static void GetPlayer1(ref string name1)
{
    Console.WriteLine("PlayerX enter your name:");
    name1 = Console.ReadLine();
}

static void GetPlayer2(ref string name2)
{
    Console.WriteLine("PlayerO enter your name:");
    name2 = Console.ReadLine();
}

static void Main(string[] args)
{
    string name1;
    string name2;
    GetPlayer1(ref name1);  // "ref" must now be specified, simply because
    GetPlayer2(ref name2);  // both methods also specify it.
}


有关ref的更多信息(例如何时或如何使用它),请参阅以下问题:
- Example of practical of "ref" use
- Why use the 'ref' keyword when passing an object?

答案 1 :(得分:0)

实际上,你没有这样做:

    string name1 = GetPlayer1(ref name1);
    string name2 = GetPlayer2(ref name2); 

您所做的是将ref关键字添加到方法定义中(创建ref 参数)。您还必须在方法调用中使用它(创建ref 参数)。

在你目前的情况下,虽然没有必要通过ref传递参数。您使用GetName方法的返回值设置它们。

答案 2 :(得分:0)

如果您使用 ref 参数定义方法,则需要使用参数作为参考调用该方法:

static void Main(string[] args)
{
    string name1 = GetPlayer1(ref name1);
    string name2 = GetPlayer2(ref name2);
}

只是为了完整性,正如其他答案已经告诉你的那样:我没有在这里看到参考调用的必要性,你可以在没有它的情况下实现你的目标。