c#/VB.net属性的优点是什么?Setters的私有访问修饰符

本文关键字:Setters 访问 是什么 VB net 属性 | 更新日期: 2023-09-27 18:21:16

下面是具有属性的类。

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

困惑-在setter中键入private访问修饰符有什么好处?

c#/VB.net属性的优点是什么?Setters的私有访问修饰符

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

至于您可能使用它的原因,也许不能信任外部代码来设置此值。该类不是严格意义上的不可变,它可以更改,但唯一可信的代码存在于类(或嵌套类)中。外界可以简单地阅读。

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

使用私有集有几个原因。

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

不过,总的来说,这是个人喜好的问题。据我所知,没有任何性能原因可以使用其中一个而不是另一个。

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

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

private setter只允许在类内部设置属性,而getter仍然公开属性值。