-1

我阅读了无数关于自动属性的文章,但无法找到不执行以下示例的理由。我在这里错过了什么吗?即有什么理由我应该在这个例子中使用常规属性?我经常这样做,而且效果很好。

在 StackOverflow 上的另一个线程(具有额外逻辑的 C#3.0 自动属性)中,答案被声明为否,如“否,自动实现的属性没有声明的实现。您希望提供的任何扩展实现都必须使用常规财产。”

    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;
        }
    }
}
4

2 回答 2

2

您没有向属性的 get/set 方法添加代码,而是向使用get/set 属性的类添加了一个完全独立的方法。

如果有人直接使用 set 方法DescriptionScary而不是使用Describe,则不会执行自定义逻辑。例如,没有什么能阻止某人做:obj.Describe(10); obj.Description = "Cute";. 如果你重载了set这些属性的方法,你可以阻止某人创建这样一个可爱而可怕的对象。

您所链接的问题的答案是完全正确的;您不能向自动实现的属性的 get/set 方法添加验证;如果你愿意,你需要明确定义 get/set 方法。

于 2012-11-21T18:36:22.930 回答
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。

如果您只是在学习何时/如何使用自动属性,那么我建议您始终从写出“正常”属性开始。然后,如果您发现自己只是获取/设置支持变量,那么您可以重构以使用自动属性。

于 2012-11-21T18:58:36.027 回答