如何从私有方法获取变量到静态方法?

How to get a variable from a private method to a static method?

在方法 nameCheck 中,我只是检查是否提供了任何输入。

起初我尝试将方法更改为static并制作了一个public变量,但后来我意识到它不能工作,因为Main方法是static所以name 无法工作。我在网上搜索并意识到我没有可以使用的对象 nameCheck 所以我解决了这个问题。

现在我不知道如何将方法 nameCheck 中的 string 转换为我的 Main 方法中的 string

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hallo, wie heißt du?");
            string name = Console.ReadLine();

            Program a = new Program();
            a.nameCheck(name);

            Console.WriteLine("Hallo " + name);


            Console.ReadLine();
        }
        private void nameCheck(string n)
        {
            if (n == "")
            {
                Console.WriteLine("Geben Sie einen Namen ein");
                n = Console.ReadLine();
            }
        }
    }

您必须 return 您的方法中的值 "nameCheck"

在您的主要方法中试试这个:

Program a = new Program();
name = a.nameCheck(name);

您的 nameCheck() 方法应如下所示:

private string nameCheck(string n)
{
    if (n == "")
    {
        Console.WriteLine("Geben Sie einen Namen ein");
        n = Console.ReadLine();
    }
    return n;
}

nameCheck:

n = Console.ReadLine();

这只是要改变局部变量的值n

即使您将方法更改为 static,您也不会得到预期的结果。

为此,您需要 return 新字符串:

private string nameCheck(string n)
{
    if (String.IsNullOrEmpty(n))
    {
        Console.WriteLine("Geben Sie einen Namen ein")
        n = Console.ReadLine();
    }
    return n;
}

然后您将更改 Main 方法:

Program a = new Program();
name = a.nameCheck(name);

将方法 nameCheck 的 return 类型更改为字符串。然后像我一样从 main 方法调用它

    Console.WriteLine("Hallo, wie heißt du?");
    string name = Console.ReadLine();

    Program a = new Program();
    string n=a.nameCheck(name);

    Console.WriteLine("Hallo " + n);


    Console.ReadLine();

private string nameCheck(string n)
{
    if (n == "")
    {
        // Console.WriteLine("Geben Sie einen Namen ein");
        return "Geben Sie einen Namen ein";
    }
    return n;
}

你有很多机会回答你的问题。

使用 ref:

定义直接更改传递的字符串的方法
private void nameCheck(ref string n)
{
    if (n == "")
    {
        Console.WriteLine("Geben Sie einen Namen ein");
        n = Console.ReadLine();
    }
}

这样称呼它:

nameCheck(ref name);

第二个 将您的方法更改为非静态方法并使用成员变量:

class program
{
    private string name;

    Main() 
    {
        //...
        Program p = new Program();
        p.Name = p.checkName();
    }

    private void nameCheck()
    {
        if (this.name == "")
        {
            Console.WriteLine("Geben Sie einen Namen ein");
            this.name = Console.ReadLine();
        }
    }
}

第三个 一个使用 return-value 的方法:

class program
{
    Main() 
    {
        //...
        Program p = new Program();
        string name = ...
        name = p.checkName(name);
    }

    private string nameCheck(string name)
    {
        if (name == "")
        {
            Console.WriteLine("Geben Sie einen Namen ein");
            name = Console.ReadLine();
        }
        return name;
    }
}    

顺便说一句,考虑使用 if (String.IsNullOrEmpty(name)) 而不是检查 =="

问题是 nameCheck 没有 return 任何东西(return 类型是 void)。

尝试以下操作:

    private string nameCheck(string n)
    {
        if (n == "")
        {
            Console.WriteLine("Geben Sie einen Namen ein");
            n = Console.ReadLine();
        }
        return n;
    }

然后你需要改变

        a.nameCheck(name);

        name = a.nameCheck(name);

最好阅读 return 类型和指针 - 尝试为它们找到一个好的教程。

要 return 来自 nameCheck void 的字符串,您实际上需要将它从 void 变为字符串,所以...

private string nameChech(string input)
{
    if(string.IsNullOrWhiteSpace(input))
         return string.Empty;
    /* other checking code */
    return input // you can do any string that may have been altered/appended/etc
}

所以现在在您的 program.cs 中您可以做到!

    static void Main(string[] args)
    {
        Console.WriteLine("Hallo, wie heißt du?");
        string name = nameCheck(console.ReadLine());
        if (name == string.Empty)
        {
            console.WriteLine(/* no name provided */);
            return;
        }
        /* other checking code */          
        Program a = new Program();
        Console.WriteLine("Hallo " + name);
        Console.ReadLine();
    }    

不是真正的答案,而是一些一般性提示:

Program 是一个非常普遍的名字。这有效地反映了您的整个程序。

C# 是面向对象的,但这并不意味着您可以将所有内容都变成对象并添加函数。访问修饰符和 static 各有其用途。

您的 class Program 有一个私有方法 nameCheck。您是否问过自己为什么 private 或为什么不 static 而是一个实例方法?
C# 编译器允许这样做,但您没有完全理解正确的语义。

由于 nameCheck 是一个完全无状态的方法,您宁愿定义它 static。此外,将 Program 更改为实际上 反映您的意图的内容
另一种方式(以及更好的 OO 方式,IMO)是使用 class 之类的 Name 以及名称的 string 数据成员和方法 nameCheckMain 方法可以知道实例化 class 并随意调用 nameCheck


我建议重新审视 OOP 的基础知识并阅读相关内容,尤其是封装。