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

本文关键字:有方法 获取 静态方法 变量 | 更新日期: 2023-09-27 17:59:25

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

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

现在我不知道如何在方法中获取方法string nameCheck 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();
            }
        }
    }

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

On nameCheck

n = Console.ReadLine();

这只会改变局部变量的值 n .

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

为此,您需要返回新字符串:

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"中返回你的值

在您的主方法中尝试此操作:

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;
}

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

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

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

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

由于nameCheck是一种完全无状态的方法,因此您宁愿将其定义为static。另外,将Program更改为实际上反映您的意图的内容。
另一种方式(以及更好的 OO 方法,IMO(是拥有一个像 Name 这样的类,其中包含一个 string 数据成员的名称和一个方法nameCheckMain方法可以知道实例化类并根据需要调用nameCheck


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

更改方法名称的返回类型签入字符串。然后像我一样从主方法调用它

    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;
}

要从您的姓名返回字符串检查 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
}

所以现在在你的程序中.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();
    }    
你有很多

机会回答你的问题。

定义使用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();
        }
    }
}

第三个使用方法的返回值:

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 不返回任何内容(返回类型为 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);

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