我们可以在C#中的属性中获取/设置访问说明符吗?请解释一下示例和用法,以及好处和暗处。这是一个面试问题。
答案 0 :(得分:2)
是的,访问修饰符对get
和set
有效。有一些常见的事情是拥有私有或受保护的set
,因此只能从类实例成员中分配属性。
属性或索引器的get和set部分称为访问器。默认情况下,这些访问者具有相同的可见性或访问级别:它们所属的属性或索引器的可见性或访问级别。但是,限制对这些访问者之一的访问有时很有用。通常,这涉及限制set访问器的可访问性,同时保持get访问器可公开访问
有关此主题的更多信息,请查看MSDN文章中的Restricting Accessor Accessibility。
答案 1 :(得分:1)
这个片段就是一个很好的例子......
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 Library中有很多这样的情况。
对于'darkside',如果界面设计不佳而且客户需要更改属性,那么最终必须重写。此外,如果在示例中已将setter声明为“private”,则会阻止后代类访问该属性,这可能会导致“shadow”覆盖,并且几乎总会导致混乱。
答案 2 :(得分:0)
规则是,如果属性都是一个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是(仍然)public
,与整个属性一样,而setter具有更受限制的访问权限,此处为private
。
将属性视为一对方法,其中一个方法的访问级别可能比另一个方法更受限制。
答案 3 :(得分:0)
是的,您可以拥有get,set的访问说明符,但有一些规则:
访问者的辅助功能级别必须更多限制,而不是属性上的辅助功能级别
仅当属性或索引器具有两者设置并获取访问者时,才能使用访问者修饰符。在这种情况下,只允许在两个访问者的一个中使用修饰符。
答案 4 :(得分:0)
是的,我们可以在C#中使用访问说明符来获取/设置属性。 如果我们不使用带有get / set属性的访问说明符,那么我们就无法访问相关属性的值,即获取/设置值。