我们可以在 C# 的属性中使用 get/set 的访问说明符吗?请举例说明和用法以及好处和缺点。这是一个面试问题。
5 回答
是的,访问修饰符对get
and有效set
。一些常见的事情是具有私有或受保护的set
属性,因此只能从类实例成员中分配属性。
属性或索引器的 get 和 set 部分称为访问器。默认情况下,这些访问器具有相同的可见性或访问级别:它们所属的属性或索引器的可见性或访问级别。但是,有时限制对这些访问器之一的访问很有用。通常,这涉及限制 set 访问器的可访问性,同时保持 get 访问器可公开访问
这个片段就是一个很好的例子......
public interface IHasInt
{
int TheInt { get; }
}
public class MyClass : IHasInt
{
public int TheInt { get; private set; }
public MyClass()
{
TheInt = 123;
}
}
在此示例中,接口指定了一个 getter,但没有指定一个 setter。因此,当某人拥有接口的实例时,他们只能访问该值,但不能更改它。
另一方面,实现类需要设置属性并且不希望任何人更改它。所以房产...
a public getter to abide by the terms of the interface; and
a private setter to allow the class to do its work
好处是任何使用接口实例的人都不能更改类的属性(从而将类置于随机状态)。因为 setter 是私有的,所以只能在类本身内更改属性。
.NET Framework 库中有很多这样的案例。
至于“黑暗面”,如果界面设计不佳并且客户需要更改属性,那么最终将不得不重写。此外,如果 setter 像示例中一样被声明为“私有”,它会阻止后代类访问该属性,这可能会导致“影子”覆盖,并且几乎总是会导致混乱。
是的,我们可以在 C# 的属性中使用访问说明符来获取/设置。如果我们不将访问说明符与 get/set 属性一起使用,那么我们就无法访问相关属性的值,即 get/set 值。
是的,您可以使用 get、set 的访问说明符,但有一些规则:
访问器的可访问性级别必须比属性的可访问性级别更严格
仅当属性或索引器同时具有set 和 get 访问器时,您才能使用访问器修饰符。在这种情况下,仅允许在两个访问器之一上使用修饰符。
规则是,如果属性同时具有 getter 和 setter(get
访问器和访问器),则仅允许在其中一个set
访问器上使用额外的访问修饰符,并且所讨论的访问器的可访问性比整个财产。
这是一个例子:
class ContainingType
{
public int MyProp
{
get
{
// code here, must return something
}
private set
{
// code here, may use special parameter 'value'
}
}
}
在示例中,getter 是 (still) public
,就像整个属性一样,而 setter 具有更受限制的访问权限,here private
。
将属性视为一对方法,其中一个方法的访问级别可能比另一个方法更受限制。