我无法理解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是否提供了额外的好处? 感谢。
答案 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
编辑:三美分
由于语言和平台支持属性概念,因此有很多事情实际上依赖正确使用属性。
许多标准机制检查类并明确查看属性:
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);
}
}