2

奇妙な質問があります。アクセサーを正しく使用する方法を理解しようとしています。クラスのプライベート変数とパブリック変数でそれらを使用するという考えが得られますが、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;

それで、私の質問(おそらくばかげている)は、アクセサーを使用するかどうかに違いがないので、そのようなパブリック変数でアクセサーを使用するポイントは何ですか?

4

1 に答える 1

2

両者の間に機能上の違いはありません。ただし、public string Telephone;(暗黙の)アクセサーを介さずに、プレーンデータで値を外の世界に公開するため、コードスメルです。

これは、既存のコードを壊すことなく、このようなある種の検証ルールを追加することは決してできないことを意味します:

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

外の世界では、これは引き続き として使用されMyClass.Emailますが、プロパティの代わりにフィールドを使用するだけでは不可能なロジックを背後に追加できます。

于 2013-10-27T21:07:19.553 に答える