什么是c#/ VB.net的Benifit / Advantage优势属性 - Setters的私有访问修饰符

时间:2012-01-25 05:54:45

标签: c# asp.net vb.net c#-4.0 properties

以下是具有属性的类。

public class abc
    {
        public int MyProperty { get; private set; }
    }

混淆 - 在setter中输入私有访问修饰符有什么好处?

5 个答案:

答案 0 :(得分:6)

简单地说,它是允许类本身设置的属性,但外部对象只能读取。也许MyProperty作为方法的副作用而改变,也许它只设置一次(在构造函数中)。重点是MyProperty的变更来源必须来自abc(或abc的嵌套类),而不是来自持有对它的引用的外部。

至于为何使用它,可能无法信任外部代码来设置此值。该类不是严格不可变的,它可以更改,但唯一可靠的代码存在于类(或嵌套类)中。外面的世界可以简单地阅读。

答案 1 :(得分:2)

private修饰符允许属性在公共,受保护或内部访问的上下文中是只读的,同时赋予类型本身设置属性的能力(即,在私有访问的上下文中)。 p>

答案 2 :(得分:1)

使用私人套装有几个原因。

1)如果您根本没有使用支持字段并且想要一个只读的自动属性:

public class abc
    {
        public int MyProperty { get; private set; }
    }

2)如果你想在你的类中修改变量并想在一个位置捕获它时做额外的工作:

private string _name = string.Empty;
public string Name 
{ 
    get { return _name; }
    private set 
    {
        TextInfo txtInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
        _name = txtInfo.ToTitleCase(value);
    }
}

但总的来说,这是个人偏好的问题。据我所知,没有性能原因可以使用其中一个。

答案 3 :(得分:1)

这样做是为了使您的属性为只读,以便不允许外部世界更改属性的值,只有实现该属性的类才能更改属性值作为属性的所有者。 作为类如何跟踪其实例计数和实例计数的示例,只能从类内部增加/减少,并且不应允许外部世界更改实例计数属性,例如:

public class Customer
{    
    public Customer()
    {
        InstanceCount++;
    }

    //Helps retrieving the total number of Customers
    public int InstanceCount { get; private set; } //Count should not be increased by the clients of this class rather should be increased in the constructor only
}

在某些情况下的另一个好处是,在为您的属性提供私有设置后,您可以提供一个Set方法,以便在您希望对收到的值进行某些计算或验证时更改外部世界的属性值(这不是在Set属性访问器中执行的最佳实践),然后按如下所示更改属性的值:

public class Customer
{
    public string City { get; private set; }

    public bool SetCity(string customerCity)
    {
        //validate that the customerCity is a valid USA city or else throw some business rule exception, and then call below code
        City = customerCity
    }
}

答案 4 :(得分:0)

私有的setter允许只在内部设置属性,而getter仍公开公开属性值。