Можно ли использовать открытую переменную в C #, если она доступна только для чтения? - PullRequest
17 голосов
/ 21 апреля 2009

Есть ли какая-то внутренняя разница между синтаксическим способом создания свойств в C #:

public string FirstName { get; set; }

и просто сделать открытые переменные такими:

public string LastName;

Я предполагаю, что первый способ предпочтительнее, а второй - избегать. Тем не менее, я часто вижу, что используется этот тип свойства readonly, который является формой второго типа выше:

public readonly string InternalCode;

Это лучший способ создания свойства только для чтения?

using System;

namespace TestProps
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            customer.FirstName = "Jim";
            customer.LastName = "Smith";
            customer.Show();
        }
    }

    class Customer
    {
        public string FirstName { get; set; } //prefered
        public string LastName; //avoid
        public readonly string InternalCode; //???

        public Customer()
        {
            InternalCode = "234729834723984";
        }

        public void Show()
        {
            Console.WriteLine("{0}, {1} ({2})", LastName, FirstName, InternalCode);
            Console.ReadLine();
        }
    }
}

Ответы [ 5 ]

17 голосов
/ 21 апреля 2009

Поскольку он еще не ответил (пока), и никто еще не ссылался на это: есть замечательная статья на эту тему Джона Скита, вносящая поправки в его книгу C # в глубину (отдать должное Джону):

Почему важны свойства

3 голосов
/ 21 апреля 2009

Использование свойства обеспечивает интерфейс, который более устойчив к изменениям в будущем. Допустим, когда-нибудь в будущем будет принято решение добавить префикс во внутренний код.

Использование публичной переменной только для чтения раскрывает вашу внутреннюю структуру, и вам будет трудно добавить префикс к каждой строке, в которой вы использовали внутреннюю переменную класса.

Используя свойство, вы можете просто написать следующее

public string InternalCode { 
    get { return _prefix + _internalCode; } 
}

и все готово!

3 голосов
/ 21 апреля 2009

По моему мнению, можно выставлять открытые поля (особенно если они только для чтения или постоянные). Сказав это, я бы сказал, что в примере, который вы представляете, я бы, вероятно, пошел со свойствами, поскольку они дадут вам 2 преимущества (над полями): 1) лучшую инкапсуляцию и могут позволить вам адаптировать свой код в будущее и 2) если вы делаете привязку данных, то вам нужны свойства.

1 голос
/ 21 апреля 2009

Да. нормально иметь открытые переменные только для чтения (просто они могут быть инициализированы во время определения или конструктора).

например. Decimal.MaxValue

Хорошо иметь свойство public readonly, если изменяется значение поддержки (отличное от того, чем оно было инициализировано).

например. Environment.TickCount

Я думал, что Environment.NewLine будет общедоступной переменной только для чтения. Что ж, это публичное свойство (только для get), и причина может заключаться в том, чтобы поддерживать совместимость на разных платформах.

0 голосов
/ 15 января 2016

Краткий ответ: public const в порядке, public readonly не обязательно, public получают без set не обязательно. Объекты, которые нельзя изменить без назначения, могут быть в порядке. Типы ссылок опасны, так как вы все равно можете изменить их значения, даже если вы не можете изменить саму ссылку.

Проблема с ключевым словом readonly заключается в том, что оно не означает, что вы понимаете как логически только для чтения / неизменяемость. Это означает, что больше похоже на «может быть назначено только в конструкторе». Ссылки не могут быть изменены, но их значения могут. К сожалению, в C # нет "настоящего" ключевого слова только для чтения. Смотри также https://blogs.msdn.microsoft.com/ericlippert/2007/11/13/immutability-in-c-part-one-kinds-of-immutability/

Свойства не могут иметь ключевое слово только для чтения (https://titombo.wordpress.com/2012/11/11/using-the-c-modifiers/). Как отмечали другие, вы можете использовать свойство и определять только get и no set, хотя вы не можете установить это свойство в конструкторе. Используя закрытый набор, вы можете установить свойство из annywhere в классе, не только в конструкторе. Поле «только для чтения» будет более ограничительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...