Функциональность Get-Set Accessor отличается наличием ключевого слова get-set - PullRequest
0 голосов
/ 10 августа 2010

В настоящее время я реализую версию алгоритма RSA для бедного человека, и я хотел, чтобы простые числа d, e, m и n были доступны только для чтения, поскольку они будут автоматически генерироваться в теле конструктора. Однако при вводе я получаю два разных результата:

class RSA
{
    public RSA() 
    {
        n = 4;
    }

    private long n { get; private set; }
}

или

class RSA
{
    public RSA() 
    {
        n = 4;
    }

    private long n { get; }
}

Читая книгу Accelarated C #, у меня сложилось впечатление, что функция приватного набора может быть реализована с помощью автоматически реализуемых свойств. Оказывается, я могу сделать это и в самом конструкторе, но только для первой версии.

Чтение стандарта C # 3.0 гласит:

A property that has both a get accessor and a set accessor is a read-write property, a property that has only a get accessor is a read-only property, and a property that has only a set accessor is a write-only property.

И все же они не ведут себя одинаково.

Простой вопрос: почему я могу инициализировать значение в своем конструкторе, когда я явно объявляю private set, но не если я делаю это неявно? Какие здесь различия?

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Не существует такого понятия, как неявный автоматически созданный частный установщик. Если вы опустите set;, вы не сможете присвоить ему значение, которое не будет компилироваться, потому что оно никогда не может быть присвоено.

Кроме того, сделав n закрытым, вы не сможете получить к нему доступ вне этого класса. Если это ваше намерение, то нет смысла использовать собственность вообще. Вы можете просто объявить его как поле: private readonly long n;

2 голосов
/ 10 августа 2010

В первом случае сеттер является приватным. Это означает, что вы можете установить значение этого свойства везде внутри этого класса, а не только в конструкторе. Во втором примере нет установщика, который не сможет установить значение. Использование поля readonly , вероятно, наиболее правильно семантически в вашем случае, так как оно позволит вам установить его значение либо в конструкторе, либо непосредственно при объявлении поля (если это поле не должно быть видно снаружи этого класса ):

class RSA
{
    public RSA() 
    {
        n = 4;
    }

    private readonly long n;
}
1 голос
/ 10 августа 2010

Если вы действительно хотите свойство со значением только для чтения, вы можете использовать свойство с явным полем поддержки IE:

public class RSA {
  private readonly long _n;
  public long n {
    get { return _n; }
  }

  public RSA() 
  {
     _n = 4;
  }
}
...