Есть ли разница между readonly и {get; }

Скорее всего, это репликация одного из других решений, но это выглядит просто из-за pythonified кода, даже если это немного грубая сила.

def largest_palindrome():
    largest_palindrome = 0;
    for i in reversed(range(1,1000,1)):
        for j in reversed(range(1, i+1, 1)):
            num = i*j
            if check_palindrome(str(num)) and  num > largest_palindrome :
                largest_palindrome = num 
    print "largest palindrome ", largest_palindrome

def check_palindrome(term):
    rev_term = term[::-1]
    return rev_term == term
18
задан Sean Vieira 27 July 2010 в 15:17
поделиться

5 ответов

Отвечая на ваш вопрос: разница между readonly и {get; }:

В int x {get; } (который не будет компилироваться, поскольку нет возможности установить x - я думаю, вам нужен public int x {get; private set;} ) ваш код может продолжать изменять x

In readonly int x; , x инициализируется либо в конструкторе, либо в строке, а затем никогда не может измениться.

23
ответ дан 30 November 2019 в 07:08
поделиться

Другие ответы являются видом outdated†¦

В более новых версиях C#, можно присвоить значение по умолчанию int x { get; } = 33;, который изменяет вещи.

В основном, это компилируется вниз в свойство только добирания с readonly частное поле поддержки. (См. https://softwareengineering.stackexchange.com/q/372462/81745 для получения дополнительной информации)

Другое различие, которое я вижу, - то, что Вы не можете использовать readonly версия при использовании интерфейсов, поскольку можно только определить методы и свойства.

2
ответ дан 30 November 2019 в 07:08
поделиться

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

Однако, если бы оно было общедоступным, определение public int x {get; } позволяет вам позже расширить определение до примерно такого:

int x { get {
     return DoSomeOperation();
    }
}

Вы можете сделать это, не нарушая работу ваших клиентов.Реализация получателя является частной, и клиенты вызывают его, не зная, является ли оно статическим значением или имеет операцию внутри его метода доступа get .

-1
ответ дан 30 November 2019 в 07:08
поделиться

Нет, эти утверждения не означают одно и то же. Полная версия свойства будет иметь подкрепляющую переменную:

private int _x;

public int X
{
    get { return _x; }
}

Другой метод в классе может изменить подкрепляющую переменную, изменив значение свойства:

private void SomeMethod(int someValue)
{
    _x = someValue * 5;
}

Ключевое слово readonly позволяет присваивать переменную-член только в объявлении или в конструкторе:

// Both of these compile

private readonly int _x = 1;

public SomeClass()
{
    _x = 5;
}

// This will not compile

private void SomeMethod(int someValue)
{
    _x = someValue * 5;
}

Поэтому свойство get-only, подкрепляющая переменная которого помечена readonly, является истинным свойством только для чтения.

4
ответ дан 30 November 2019 в 07:08
поделиться

readonly int x; объявляет в классе поле только для чтения. Это поле может быть назначено только в конструкторе, и его значение не может изменяться в течение всего времени существования класса.

int x {получить; } объявляет автоматически реализуемое свойство только для чтения и в этой форме является недопустимым (потому что у вас не будет никакой возможности установить значение). Обычное свойство только для чтения не гарантирует возврата одного и того же значения при каждом вызове. Значение может меняться в течение всего времени существования класса. Например:

public int RandomNumber
{
    get { return new Random().Next(100); }
}

Это будет возвращать другой номер каждый раз, когда вы звоните по нему. (Да, это ужасное злоупотребление собственностью).

12
ответ дан 30 November 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: