【问题标题】:Passing variable values between methods...?在方法之间传递变量值...?
【发布时间】:2013-01-26 19:10:46
【问题描述】:

有人可以帮我在 c# 中将值从一个类方法传递到另一个类方法吗?我试过查找它,但我迷失在代码页面中,我找不到一个简单的例子。看看以下内容:

//Main Program Program.cs
namespace simplecode
{

    class Program
    {
        static void Main(string[] args)
        {
            Values Values = new Values();
            Values.getName();
        }
    }
}


//Separate class file or object Values.cs 


namespace simplecode
{
    public class Values
    {
        public static void getName()
        {
            Console.Clear();
            Console.Write("Enter name: ");
            string myName = Console.ReadLine();
        }
    }
}

现在,如果我执行这个,主程序运行 getName 并且我可以存储 myName 变量。如何从主程序或另一个单独的类方法中获取 myName 的值?我试图从概念上理解这一点,我需要正确的语法。如果有人可以解释需要什么或提供学习链接 ID,不胜感激。

谢谢 迈克

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    你可以让方法返回这个值:

    public static string getName()
    {
        Console.Clear();
        Console.Write("Enter name: ");
        return Console.ReadLine();
    }
    

    然后在你的主程序中调用该方法并将结果存储在一个局部变量中:

    static void Main(string[] args)
    {
        string myName = Values.getName();
    }
    

    请注意,由于getName 是一个静态方法,您无需创建Values 类的实例即可调用它。您可以直接在类型名称上调用它。

    另一方面,如果 getName 方法不是静态的:

    public string getName()
    {
        Console.Clear();
        Console.Write("Enter name: ");
        return Console.ReadLine();
    }
    

    那么你需要实例:

    static void Main(string[] args)
    {
        Values values = new Values();
        string myName = values.getName();
    }
    

    【讨论】:

    • 而程序员实际上不需要创建new Values(),因为该方法是静态的
    • @canpoyrazoğlu,说得好。我将更新我的答案以包含此评论。
    • 谢谢大家,我得到了 void 返回类型的错误。如果我将类型更改为字符串并返回 getName,则会收到错误非委托类型...
    • 非常感谢您。在以前的项目中,我试图返回方法名称而不是“返回 Console.ReadLine()”。我认为这样说的合乎逻辑的方式是您需要正确返回 LOCAL 值?如果它是输入值,则“返回 Console.ReadLine()”。我希望我做对了。
    【解决方案2】:

    首先,您需要将变量实际存储在某处。现在它是方法中的一个局部变量,因此在您为其赋值后它会立即消失。

    使其成为类中的属性,并使方法成为实例方法而不是静态方法:

    namespace simplecode
    {
        public class Values
        {
    
            public string MyName { get; set; }
    
            public void getName()
            {
                Console.Clear();
                Console.Write("Enter name: ");
                MyName = Console.ReadLine();
            }
        }
    }
    

    现在您可以调用该方法并在之后获取值:

    namespace simplecode
    {
    
        class Program
        {
            static void Main(string[] args)
            {
                Values myValues = new Values();
                myValues.getName();
                Console.WriteLine(myValues.MyName);
            }
        }
    }
    

    【讨论】:

    • 这也很有帮助,谢谢。我当前的项目是一个简单的登录控制台应用程序,我很可能不得不使用您的方法,因为我不希望这些值消失。
    • 本质上是一行: public string MyName { get;放; } ,只是一个“空容器”对吗?
    • @MikeB:它是带有支持变量的参数的简写,即private string _myName; public string MyName { get { return _myName; } set { _myName = value; } },但私有支持变量有一个秘密的编译器生成名称。
    • 好吧,它是一个简写或快捷方式,但编译器生成名称的目的只是作为一个空容器,可以随时调用,而不是在方法中编译时被销毁。对吗?
    • @MikeB:属性只是处理成员变量的面向对象的方式。它是类的成员,因此每个类实例都有一个,并且只要该实例存在,它就会存在。
    【解决方案3】:

    通常你会从函数中返回值。您将需要考虑您的代码如何调用不同的模块。

    您可能会发现如果流程很复杂,您可能需要查看控制反转,尽管它与主题无关且更高级,它与代码如何链接在一起,我认为这是您的潜在问题/问题。

    如果您有多个值要返回,您可以使用结构/类或将参数标记为 ref 允许您从函数内部进行修改(通过引用传递变量,而不是通过默认值传递它们)。

    【讨论】:

    • 我认为这让我感到困惑。我注意到关于 OUT 和 REF 语句的很多说明,但现在我想我只是对返回没有清楚的了解。我试图返回实际的方法名称,而不是 return Console.ReadLine();
    猜你喜欢
    • 2013-10-30
    • 2018-08-08
    • 2014-07-13
    • 2012-03-20
    • 2021-01-23
    • 2013-08-01
    相关资源
    最近更新 更多