-1

我们可以在 C# 的属性中使用 get/set 的访问说明符吗?请举例说明和用法以及好处和缺点。这是一个面试问题。

4

5 回答 5

2

是的,访问修饰符对getand有效set。一些常见的事情是具有私有或受保护的set属性,因此只能从类实例成员中分配属性。

属性或索引器的 get 和 set 部分称为访问器。默认情况下,这些访问器具有相同的可见性或访问级别:它们所属的属性或索引器的可见性或访问级别。但是,有时限制对这些访问器之一的访问很有用。通常,这涉及限制 set 访问器的可访问性,同时保持 get 访问器可公开访问

查看MSDN 文章中的Restricting Accessor Accessibility以了解有关此主题的更多信息。

于 2013-07-14T17:37:04.520 回答
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 库中有很多这样的案例。

至于“黑暗面”,如果界面设计不佳并且客户需要更改属性,那么最终将不得不重写。此外,如果 setter 像示例中一样被声明为“私有”,它会阻止后代类访问该属性,这可能会导致“影子”覆盖,并且几乎总是会导致混乱。

于 2013-07-14T17:42:35.517 回答
0

是的,我们可以在 C# 的属性中使用访问说明符来获取/设置。如果我们不将访问说明符与 get/set 属性一起使用,那么我们就无法访问相关属性的值,即 get/set 值。

于 2013-08-06T07:34:17.487 回答
0

是的,您可以使用 get、set 的访问说明符,但有一些规则:

  • 访问器的可访问性级别必须比属性的可访问性级别严格

  • 仅当属性或索引器同时具有set 和 get 访问器时,您才能使用访问器修饰符。在这种情况下,仅允许在两个访问器之一上使用修饰符。

于 2013-07-14T17:58:39.070 回答
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 是 (still) public,就像整个属性一样,而 setter 具有更受限制的访问权限,here private

将属性视为一对方法,其中一个方法的访问级别可能比另一个方法更受限制。

于 2013-07-14T17:40:14.713 回答