C#中的成员变量vs out参数

时间:2012-05-21 14:07:58

标签: c# c#-4.0

哪一个更好?在类中声明成员变量或返回方法的参数?性能方面哪一个更好。

class A{ 
    //Declaring member variable
    private string name;
    private int age; 

    private method Display()
    { 
        Passing(); 
        Console.Write("{0}-{1}",name,age); 
    }

    private void Passing() 
    { 
        name = "Hello World"; 
        age = 21; 
    }
}

class A{
    //out parameter implementation 
    private method Display()
    { 
        string name= string.Empty; 
        int age = 0; 

        Passing(out name,out age); 

        Console.Write("{0}-{1}",name,age); 
    }

    private void Passing(out string name,out int age) 
    { 
        name = "Hello World"; 
        age = 21; 
    }
} 

4 个答案:

答案 0 :(得分:7)

他们中没有人。我会去:

class A
{
    private void Display()
    {
        string name = Passing();
        Console.WriteLine(name);
    }
    private string Passing()
    {
        return "Hello world";
    }
}

如果你想要返回多个东西,我会把它封装在像这样的对象中:

class A
{
    private void Display()
    {
        var person= Passing();
        Console.WriteLine(person.Name + ": " + person.Age);
    }
    private Person Passing()
    {
        return new Person() {Name = "John Doe", Age = 99 };
    }
}

答案 1 :(得分:3)

嗯,嗯,都没有。为什么没有返回值?

class A
{
    private void Display()
    {
        string name = GetString();
        Console.Write(name);
    }

    private string GetString()
    {
        return "Hello World";
    }
}

不确定你想要在这里实现什么。

现在好了,我们知道你想要实现什么,如果该方法纯粹是类的内部,那么它取决于你返回的值的范围。如果它们在逻辑上包含在类中,请转到成员变量。如果它们的范围仅限于方法中的内部使用,请将输出参数或自定义类型作为返回值(此处可以使用Tuple<>)。

你甚至可以使用匿名类型,但正如Jon Skeet所说,它有点像hacky:

https://msmvps.com/blogs/jon_skeet/archive/2009/01/09/horrible-grotty-hack-returning-an-anonymous-type-instance.aspx

答案 2 :(得分:1)

当然,前者。使用输出参数通常不是一个好主意。不要误解我的意思,params有它们的用途,但是在设置状态的情况下就像在这种情况下不要使用它们。它们适用于像TryParse这样的东西,你返回一个指示解析是否成功的bool,然后在out参数中返回解析的结果。

答案 3 :(得分:0)

我的偏好是:

class A
{
    private static void Main(string[] args)
    {
        Passing passing = new Passing("Hello World");
        Console.WriteLine(passing);
     }
}

class Passing
{
    public Passing(string name)
    {
        Name = name;
    }

    public string Name { get; private set; }

    public override string ToString()
    {
        return string.Format("Name: {0}", Name);
    }
}