在方法中修改变量是不好的做法吗?

时间:2011-04-15 05:04:10

标签: c# methods parameter-passing

哪种方法风格更好? 在方法中修改变量通常是不好的做法吗?

public class Person
{
   public string Name { get; set;}
}

//Style 1
public void App()
{
    Person p = new Person();
    p.Name = GetName();
}
public string GetName()
{
   return "daniel";
}

//Style 2
public void App()
{
    Person p = new Person();
    LoadName(p)
}
public void LoadName(Person p)
{
   p.Name = "daniel";
}

5 个答案:

答案 0 :(得分:3)

我认为当方法不改变传递的对象时,代码更清晰可读。特别是传递对象的内部字段 有时可能需要这样做。但总的来说,我会避免它。

根据评论更新(好点)

答案 1 :(得分:3)

有时两种风格都有意义。例如,如果您只是设置名称,那么您可能会使用第一种样式。不要将对象传递给方法来改变一件事,只需检索一件事。这种方法现在更具有可重复使用的附带效益。可以把它想象为得墨忒耳定律或最少知识原则。

在其他情况下,您可能需要根据用户输入进行批量更新。如果您正在显示某人的属性并允许用户进行修改,则可能将该对象传递给单个方法,以便可以在一个位置应用所有更新。

任何一种方法都可以在不同时间保证。

答案 2 :(得分:1)

我同意安东尼的回答。 There are times when both styles may make sense.

此外,为了更具可读性,您可以在人员类中添加LoadName功能。

public void App()
{
    Person p = new Person();
    p.LoadName(); //If you need additional data to set the Name. You can pass that as Parameter
}

答案 3 :(得分:0)

我同意罗恩的观点。虽然您的特定示例可能因发布原因而略有做法,但我会为Name和私有的setter设置一个公共getter。将名称传递给构造函数,并在那里设置Name属性,但之后不能再修改。

例如:

public class Person
{
    public string Name { get; private set; }

    public Person( string name)
    {
        Name = name;
    }
}

答案 4 :(得分:0)

您正在使用技术上通过方法访问数据。您担心的是访问iVar或内部变量的属性。因为允许访问iVar通常很糟糕是因为任何人都可以在您不知情或未经您许可的情况下修改变量,如果通过方法(属性),您可以在获取或设置时拦截消息,或防止它被读或写,因此通常被认为是最好的做法。