9

我有以下课程:

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

我有一个接受PersonString作为参数的方法:

public void ChangeName(Person p, String name)
{
     p.Name = name;
}

由于Person是通过引用传递的,它应该更改Name传递的实例的。

但是这种方法是否比上述方法更具可读性?

public Person ChangeName(Person p, String name)
{
     p.Name = name;
     return p;
}
4

8 回答 8

12

它更具可读性吗?不。事实上,你可能会做更多的伤害他们的好事。

通过让它返回一个 Person 对象,它可能会让您相信,它实际上不是修改 Person 参数,而是基于 p 创建一个新的 Person,但名称不同,并且有人可能错误地认为 p 永远不会更改。

无论哪种方式,如果您有一个对类没有影响的方法,它的一部分应该是静态的。这可以帮助您确定它不会影响其类。仅当您需要该方法返回一个值时才让该方法返回一个值。

所以这是我对这种方法的建议:

public static void ChangeName(Person p, String name)
{
    p.Name = name;
}
于 2011-03-11T06:05:57.080 回答
1

首先,在第一个示例中 p 不是通过引用传递的。您的第二种方法使人们相信它正在返回一个不是的新引用。所以我不认为第二个比第一个更清楚。

于 2011-03-11T07:21:13.563 回答
1

这两种方法都没有对错。取决于你的程序需要什么。

很少需要返回传递给方法的参数,因为用户总是可以只使用作为参数传递的变量。

但是,它为您提供了最终覆盖此实现的灵活性,或将此实现传递给另一个接受具有相似签名的委托的函数。然后你可以传入其他不返回相同 Person 对象的实现。

仅在您确实需要灵活性时才这样做。

于 2011-03-11T06:10:35.723 回答
1

我建议您使用以下之一以获得最佳可读性:

public static void ChangeName(Person p, String name)
{
    p.Name = name;
}

public static Person WithName(Person p, String name)
{
    return new Person(p) { Name = name };    
}

第二个将 Person 对象视为不可变的,并且不会更改对象的状态。ChangeName 函数显式更改输入对象的状态。我认为明确区分这两种方法很重要。一个好的经验法则是一个方法不应该改变一个对象的状态并且同时返回一个。

于 2011-03-11T06:58:18.440 回答
0

我相信您的第二种方法不是YAGNI更具可读性。但是如果你像这样改变它

public static class PersonExtensions 
{
public static Person ChangeName(this Person p, String name)
{
 p.Name = name;
 return p;
}

你将有一个流利界面的扩展方法a la

new Person().ChangeName("Peter Smith").SendEmail().Subject("Test Mail").Receiver("....)
于 2011-03-11T07:15:09.460 回答
0

是了解按值/引用传递参数的权威参考。

查看代码,为什么不使用属性?

public string Name
{
   set {name = value;}
   get { return name; }
}

编辑:自动实现的属性

public string Name
{
   set;
   get;
}
于 2011-03-11T07:21:46.210 回答
0

在你描述的情况下,我不会说。它不是很清楚你想用这种方法做什么。只需使用对象并设置属性。将方法插入执行路径只会使理解复杂化,并创建对 Person 对象及其基础值的另一个依赖关系。

如果您要问的元问题涉及您发布的代码之外的一些设计,那么我错过了它。

于 2011-03-11T06:09:12.170 回答
0

第一个更好,因为第二个可能会让你相信 p 是不可变的。但是,整个方法是无用的,因为它只是调用 setter。为什么不直接调用setter?

于 2011-03-11T06:10:33.820 回答