我阅读了有关自动属性的大量文章,并且无法提出不执行类似以下示例的操作的原因。我在这里遗漏了什么;也就是说我有什么理由在这个例子中使用常规属性?我经常这样做,效果很好。
在StackOverflow(C#3.0 Automatic properties with extra logic)的另一个线程中,答案被声明为否,因为“不,自动实现的属性没有声明的实现。您希望提供的任何扩展实现都必须使用常规财产。“
class Foobar
{
public string Description { get; set; }
public bool Scary { get; private set; }
public void Describe(int size)
{
if (size <= 3)
{
switch (size)
{
case 1:
Description = "Cute";
Scary = false;
break;
case 2:
Description = "Interesting";
Scary = false;
break;
case 3:
Description = "Interesting";
Scary = false;
break;
}
}
else if (size > 4 && size < 10)
{
Description = "I'm sweating!";
Scary = true;
}
else
{
Description = "I'm outta here - every man for himself";
Scary = true;
}
}
}
答案 0 :(得分:2)
您没有在属性的get / set方法中添加代码,而是在使用 get / set属性的类中添加一个完全独立的方法。
如果有人直接使用Description
或Scary
的设置方法,而不是使用Describe
,则不会执行自定义逻辑。例如,没有什么能阻止某人做:obj.Describe(10); obj.Description = "Cute";
。如果您为这些属性重载了set
方法,则可能会阻止某人创建这样一个可爱且可怕的对象。
你所链接的问题的答案是完全正确的;您无法将验证添加到自动实现的属性的get / set方法;如果你想要,你需要明确定义get / set方法。
答案 1 :(得分:1)
您发布的代码使用自动实现的属性,并且很好。
从逻辑上理解,您的自动属性与此相同非常重要:
private string _description;
public string Description
{
get { return _description; }
set { _description = value; }
}
private bool _scary;
public bool Scary
{
get { return _scary; }
}
我认为理解这一点对理解为什么“你希望提供的任何扩展实现必须使用常规属性至关重要。”
自动属性在逻辑上只能与上面的内容相同。换句话说,自动属性就是它。它是上述代码的简写。
因此,如果您想在属性中包含其他或不同的逻辑,则无法使用自动属性。
例如,您的类可以重构(记住“可能”并不意味着“应该”)同时取消Describe
方法并将所有逻辑封装到属性中:
class Foobar
{
private int _size;
public string Description
{
get
{
if (_size == 1)
{
return "Cute";
}
else if (_size < 4)
{
return "Interesting";
}
else if (_size < 10)
{
return "I'm sweating!";
}
else
{
return "I'm outta here - every man for himself";
}
}
}
public bool Scary
{
get
{
return _size > 3;
}
}
public Foobar(int size)
{
_size = size;
}
}
但是如果你这样做了,你就无法使用自动属性,因为你需要的逻辑不仅仅是一个简单的get / set。
如果您只是在学习何时/如何使用自动属性,那么我建议始终先写出“普通”属性。然后,如果您发现自己只是获取/设置支持变量,那么您可以重构以使用自动属性。