Compartilhar via


Assimétrico acessador acessibilidade (guia de programação translation from VPE for Csharp)

The obter and conjunto são chamados de partes de uma propriedade ou indexadoracessadores.Por padrão esses acessadores têm a mesma visibilidade ou nível de acesso: que o da propriedade ou indexador às quais eles pertencem.Para obter mais informações, consulte níveis de acessibilidade.No entanto, às vezes é útil restringir o acesso a um desses acessadores.Normalmente, isso envolve restringir a acessibilidade do set acessador, e manter o get acessador acessível publicamente. Por exemplo:

private string name = "Hello";

public string Name
{
    get
    {
        return name;
    }
    protected set
    {
        name = value;
    }
}

Neste exemplo, uma propriedade chamada Name define um get e set acessador. The get acessador recebe o nível de acessibilidade da própria, propriedade public Nesse caso, enquanto o set acessador explicitamente é restrito ao aplicar o protegido modificador de acesso para o acessador propriamente dito.

Restrições de acesso modificadores no acessadores

Usando o acessador modificadores em propriedades ou indexadores estão sujeitas a estas condições:

  • Não é possível usar modificadores de acesso em uma interface ou um explícita interface membro implementação.

  • Você pode usar modificadores de acessador somente se a propriedade ou o indexador tiver dois set e get acessadores. Nesse caso, o modificador é permitido em um só dos dois acessadores.

  • Se a propriedade ou indexador tiver um Substituir modificador, o modificador de acessador deve coincidir com o acessador de acessador substituído, se houver.

  • O nível de acessibilidade no acessador deve ser mais restritivo do que o nível de acessibilidade na propriedade ou indexador propriamente dito.

Modificadores de acesso nos acessadores de substituição

Quando você substitui uma propriedade ou indexador, os acessadores substituídos devem estar acessíveis para o código de substituir.Além disso, o nível de acessibilidade de tanto o propriedade/indexador e que os acessadores devem corresponder o propriedade substituído correspondente/indexador quanto os acessadores.Por exemplo:

public class Parent
{
    public virtual int TestProperty
    {
        // Notice the accessor accessibility level.
        protected set { }

        // No access modifier is used here.
        get { return 0; }
    }
}
public class Kid : Parent
{
    public override int TestProperty
    {
        // Use the same accessibility level as in the overridden accessor.
        protected set { }

        // Cannot use access modifier here.
        get { return 0; }
    }
}

Implementar interfaces

Quando você usa um acessador para implementar uma interface, o acessador pode não ter um modificador de acesso.No entanto, se você implementar a interface usando um acessador, por exemplo, get, Outros acessador pode ter um modificador de acesso, sistema autônomo no exemplo a seguir:

public interface ISomeInterface
{
    int TestProperty
    {
        // No access modifier allowed here
        // because this is an interface.
        get;   
    }
}

public class TestClass : ISomeInterface
{
    public int TestProperty
    {
        // Cannot use access modifier here because
        // this is an interface implementation.
        get { return 10; }

        // Interface property does not have set accessor,
        // so access modifier is allowed.
        protected set { }
    }
}

Domínio de acessibilidade do acessador

Se você usar um modificador de acesso no acessador, a domínio de acessibilidade do acessador é determinado por esse modificador.

Se você não usou um modificador de acesso do acessador, o domínio de acessibilidade do acessador é determinado pelo nível de acessibilidade da propriedade ou indexador.

Exemplo

O exemplo a seguir contém três classes, BaseClass, DerivedClass, e MainClass. Há duas propriedades sobre o BaseClass, Name e Id em ambas as classes. O exemplo demonstra sistema autônomo a propriedade Id em DerivedClass pode ser oculto pela propriedade Id em BaseClass Quando você usa um modificador de acesso restritivas, sistema autônomo protegido or particular.Portanto, quando você atribuir valores a essa propriedade, a propriedade no BaseClass classe é chamada em vez disso. O modificador de acesso a substituição por pública fará com que a propriedade acessíveis.

O exemplo também demonstra que um modificador de acesso restritivas, sistema autônomo private ou protected, sobre o set assessor da Name propriedade no DerivedClass impede o acesso para o acessador e gera um erro quando você atribui a ele.

public class BaseClass
{
    private string name = "Name-BaseClass";
    private string id = "ID-BaseClass";

    public string Name
    {
        get { return name; }
        set { }
    }

    public string Id
    {
        get { return id; }
        set { }
    }
}

public class DerivedClass : BaseClass
{
    private string name = "Name-DerivedClass";
    private string id = "ID-DerivedClass";

    new public string Name
    {
        get
        {
            return name;
        }

        // Using "protected" would make the set accessor not accessible. 
        set
        {
            name = value;
        }
    }

    // Using private on the following property hides it in the Main Class.
    // Any assignment to the property will use Id in BaseClass.
    new private string Id
    {
        get
        {
            return id;
        }
        set
        {
            id = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        BaseClass b1 = new BaseClass();
        DerivedClass d1 = new DerivedClass();

        b1.Name = "Mary";
        d1.Name = "John";

        b1.Id = "Mary123";
        d1.Id = "John123";  // The BaseClass.Id property is called.

        System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
        System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    Base: Name-BaseClass, ID-BaseClass
    Derived: John, ID-BaseClass
*/

Comentários

Observe que, se você substituir a declaração new private string Id Por new public string Id, você obtém a saída:

Name and ID in the base class: Name-BaseClass, ID-BaseClass

Name and ID in the derived class: John, John123

Consulte também

Conceitos

Guia de Programação C#

Referência

Propriedades (Guia de programação do C#)

Indexadores (guia de programação C#)

Modificadores de acesso (guia de programação C#)