获取集属性的真正好处

时间:2014-03-03 13:58:56

标签: c# oop

我无法理解C#get / set属性。我已经在互联网上阅读了关于这个主题的讨论,但仍然无法理解它的真正好处。

希望有人可以通过以下示例指出我正确的方向,谢谢。

示例1:使用get和set属性

using System;
class Person
{
private string myName ="N/A";
private int myAge = 0;

// Declare a Name property of type string:
public string Name
{
    get 
    {
       return myName; 
    }
    set 
    {
       myName = value; 
    }
}

// Declare an Age property of type int:
public int Age
{
    get 
    { 
       return myAge; 
    }
    set 
    { 
       myAge = value; 
    }
}

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

public static void Main()
{
    Console.WriteLine("Simple Properties");

    // Create a new Person object:
    Person person = new Person();

    // Print out the name and the age associated with the person:
    Console.WriteLine("Person details - {0}", person);

    // Set some values on the person object:
    person.Name = "Joe";
    person.Age = 99;
    Console.WriteLine("Person details - {0}", person);

    // Increment the Age property:
    person.Age += 1;
    Console.WriteLine("Person details - {0}", person);
}
}

示例2:使用常规方法

  using System;
  class Person
  {
  private string myName ="N/A";
  private int myAge = 0;

// Declare a Name property of type string:
public string GetName() 
{
   return myName; 
}

public SetName(string value) 
{
   myName = value;
}

// Declare an Age property of type int:
public int GetAge() 
{ 
   return myAge; 
}

public setAge(int value) 
{ 
   myAge = value; 
}

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

public static void Main()
{
    Console.WriteLine("Simple Properties");

    // Create a new Person object:
    Person person = new Person();

    // Set some values on the person object:
    person.SetName("Joe");
    person.SetAge = 99;
    Console.WriteLine("Person details - {0}", person);

    // Increment the Age property:
    person.SetAge(person.SetAge + 1);
    Console.WriteLine("Person details - {0}", person);
 }
 }

所以,我的问题是,如果我使用方法2而不是方法1,是否有任何区别。方法1是否提供了额外的好处? 感谢。

2 个答案:

答案 0 :(得分:4)

属性确实是getter和setter方法的一些语法糖。但不同之处在于不是化妆品。

不同之处在于类型信息和命名的一致性。

使用Get / Set方法,很容易意外地以其中一个的名义输入拼写错误。这可能会导致一些配对机制失败。对于属性,没有变化:getter总是get_PROPNAME,setter总是set_PROPNAME。

返回值和接受参数的类型存在类似问题:属性保证它们相同。

此外,还有一个Reflection可以在运行时检查对象。使用Get / Set方法,您必须设计自己的猜测Get / Set如何配对的方法。这似乎很容易,但是随着继承和过载,它可能会变得毛茸茸。在查找,例如,Attributes应用于哪一个(例如,应该在GetName上应用[NonPersistent]应用于SetName而没有这样的属性时,它会变得更加复杂?)。有了属性,没有这样的问题。

换句话说:属性就是它们的名称:它们定义了一个属性。可读,可写,只读,可写,部分公开,虚拟等 - 但属性。

方法,甚至可以很好地命名为Get / Set - 是单独的方法。如果它们被用作“财产” - 那么让它们保持正确同步就更难了。

<强>证明:

即使你的代码示例很简单,也让它们错配,看看:

public int GetAge()       // <- different character casing
 ...
public setAge(int value)  // <- different character casing

编辑:三美分

由于语言和平台支持属性概念,因此有很多事情实际上依赖正确使用属性。

许多标准机制检查类并明确查看属性:

  • UI框架及其数据绑定(WPF!WinForms!..)
  • 序列化和ORM框架(EF!NH!XPO!..)
  • 经典且广泛使用的更改通知机制按设计绑定到属性(INotifyPropertyChanged!)

等等。如果您退出使用“属性”,则会自动丢失该属性。我个人无法想象没有数据绑定编写WinForms或WPF应用程序,但YMMV当然:)

答案 1 :(得分:0)

它使您的代码更短,更易于阅读。更好的方法是利用c#3中引入的自动getter和setter。

public string FirstName {get; set;}

public string FirstName {get; private set;}

public string FirstName {get; protected set;}

您仍然拥有私密设置的优势,但您的代码更短,更易读。然后可以重写您的Person类以具有完全相同的功能,但显着缩短:

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

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public override string ToString()
    {
        return string.Format("Name = {0}, Age = {1}", Name, Age);
    }
}