【问题标题】:Is it bad practice to modify the variable within a method?在方法中修改变量是不好的做法吗?
【发布时间】:2011-08-06 01:36:21
【问题描述】:

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

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

【问题讨论】:

    标签: c# methods parameter-passing


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      根据评论更新(好点)

      【讨论】:

      • 值得一提的是,所展示的任何一种风格都没有通过引用传递。使用了引用类型,是的。引用的副本按值传递。这与 C# 中的“通过引用传递”有根本的区别。
      【解决方案3】:

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

      此外,为了提高可读性,您可以在 person 类中添加 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
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我同意罗恩的观点。尽管出于发布原因,您的特定示例可能会略微做作,但我将有一个用于 Name 的公共 getter 和一个私人 setter。将名称传递给构造函数,Name 属性将在那里设置,但之后无法再修改。

          例如:

          public class Person
          {
              public string Name { get; private set; }
          
              public Person( string name)
              {
                  Name = name;
              }
          }
          

          【讨论】:

          • 所以如果一个人合法地改变了他或她的名字,也许结婚了,这不能在你建议的对象模型中表示?
          • 如果您添加了更改名称的方法,我会假设如果您要更改名称,那么除了更改名称之外还有更多的事情发生。
          • @Phill,一种更改名称的方法听起来有点像二传手。我们在 C# 中有这样的习语。 ;) 不仅如此,答案的文本暗示了构建后的不变性。一个人本质上是多变的。
          • @Anthony 我只是假设这是一个人为的例子。如果我只是将属性重命名为FirstName 怎么样? :)
          • 话说回来,这确实让我想起了我在大学遇到的一个人,他说:“嗨,我叫 Jim,但你可以叫我 Drew”。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-13
          • 2017-05-06
          • 2013-04-05
          相关资源
          最近更新 更多