2010-08-10 4 views
0

В настоящее время я реализую версию алгоритма RSA для малоимущего человека, и я хотел, чтобы простые числа d, e, m и n были доступны только для чтения, так как они будут автоматически сгенерированы внутри тела конструктора. Тем не менее, я получаю два различных результата, когда я типа:Функция Get-Set Accessor отличается наличием ключевого слова get-set

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, но не если я делаю это неявно? В чем отличия здесь?

ответ

2

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

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

    private readonly long n; 
} 
2

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

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

1

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

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

    public RSA() 
    { 
    _n = 4; 
    } 
}