c#/VB.net属性的优点是什么?Setters的私有访问修饰符
本文关键字:Setters 访问 是什么 VB net 属性 | 更新日期: 2023-09-27 18:21:16
下面是具有属性的类。
public class abc
{
public int MyProperty { get; private set; }
}
困惑-在setter中键入private访问修饰符有什么好处?
简单地说,它是允许类本身设置的属性,但外部对象只能读取。也许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仍然公开属性值。