【问题标题】:C# get set accessorsC# 获取设置访问器
【发布时间】:2013-10-27 21:02:37
【问题描述】:

我有一个奇怪的问题。我试图了解如何正确使用访问器。我想到在类中将它们与私有和公共变量一起使用,但 C# 3.0 允许我们仅将它们与公共变量一起使用(即)

public string Email {get; set;}

所以,我正在编写一个应用程序 - 这是我的代码的一部分:

public class Customers
{
   public string Telephone;
   public string Email {get; set;}
   public void LoadCustomer(string _name)
   {
       DataSet dataSet = new DataSet();
       dataSet.ReadXml("Customers.xml");


       XDocument doc = XDocument.Load("Customers.xml");
       XElement root = doc.Root;
       for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
       {

           var Klient = from wpisy in root.Elements("Customer")
                        where wpisy.Element("Name").Value.Equals(_name)
                        select wpisy;
           Telephone = Klient.First().Element("Telephone").Value;
           Email = Klient.First().Element("Email").Value;

       }
    }
}

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
    Customers customer = new Customers();
    customer.LoadCustomer(name);
    txt_Telephone.Text = customer.Telephone;
    txt_Email.Text = customer.Email;
}

如您所见,我有一个类和一个在打开窗口时调用该类的方法。每当我使用访问器时,一切正常:

public string Email {get; set;}

或者我不这样做:

public string Telephone;

那么,我的问题(也许很傻)是什么时候使用带有此类公共变量的访问器有什么意义,因为我使用它们时没有区别?

【问题讨论】:

标签: c# class get set accessor


【解决方案1】:

两者在功能上没有区别。但是,public string Telephone; 是一种代码味道,因为它通过其纯数据向外部世界公开您的价值,而不是通过(隐式)访问器。

这意味着在不破坏现有代码的情况下,您将永远无法像这样添加某种验证规则:

private string _email;
public string Email {
 get { return _email }
 set {
  if(value.Contains("@") { _email = value }
 }
}

对于外界来说,这仍然被用作MyClass.Email,但你可以在它后面添加逻辑,如果你只是使用一个字段而不是一个属性,这是不可能的。

【讨论】:

  • 好的,但是如果我不需要添加任何验证规则,那么只使用公共字段而不是属性是错误的吗?使用 EMPTY 属性有什么意义?
  • 封装是面向对象编程的基本原则之一。如果你打算大步离开这条路,你的项目就没有一致性(有时是访问者,有时没有),你不能在未来扩展功能等等。所以是的,这是错误的,因为它违背了封装的整个思想,OOP 的基石。没有所谓的“空属性”,而是一个具有非常基本的 getter 和 setter 的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多