C#自动属性设置

时间:2012-11-21 18:32:33

标签: c# properties

我阅读了有关自动属性的大量文章,并且无法提出不执行类似以下示例的操作的原因。我在这里遗漏了什么;也就是说我有什么理由在这个例子中使用常规属性?我经常这样做,效果很好。

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

2 个答案:

答案 0 :(得分:2)

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

如果有人直接使用DescriptionScary的设置方法,而不是使用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。

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