Свойство C только для чтения#

#c# #.net #properties

#c# #.net #свойства

Вопрос:

Я хочу иметь свойство только для чтения в объекте передачи данных, объекте DTO, без набора; аксессуар, подобный:

 public class ViewBannerDTO
    {
        public int Id { get;  }
    }
  

но зачем получать:

‘ViewBannerDTO.Id.get’ должен объявлять тело, поскольку оно не помечено как abstract или extern. Автоматически реализуемые свойства должны определять как методы доступа get, так и set.

а также почему я не могу:

 public readonly int Id{get;}
  

Комментарии:

1. Просто добавьте private set; , разве это не сработало бы?

2. Если вы определяете средство получения и не устанавливаете его для автоматического свойства , то оно никогда не сможет вернуть ничего, кроме 0 . Какой в этом был бы смысл?

3. @Kilazur правильно, но я хочу только для чтения

4. Как ты думаешь, что такое личное?

5. @Mohammadreza private максимально приближен к автоматически реализованному свойству — что -то должно иметь возможность устанавливать свойство.

Ответ №1:

У вас не может быть никакого параметра для автоматически реализованного свойства (иначе как бы вы его установили?). Вы можете либо добавить реализацию средства получения (и, при необходимости, резервное поле), либо использовать private средство установки:

 public class ViewBannerDTO
{
    public int Id { get; private set; }
}
  

Почему я не могу сделать:

 public readonly int Id{get;}
  

потому что readonly применяется только к полям. Вы можете выполнить то же самое со свойством, используя readonly резервное поле и без set средства доступа:

 private readonly int _Id;
public int Id {get { return _Id; } }
  

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

Комментарии:

1. что такое модификатор доступа по умолчанию для set в: public int Id {get;set;} другими словами, если он общедоступен по умолчанию, почему компилятор не принимает «общедоступный набор»; Имея в виду, я читаю свойство: определите целочисленную переменную и назовите ее Id и определите общедоступный (неявно) или частный (должен быть определен явно) get и общедоступный (неявно) или частный (должен быть определен явно), так почему я не могу явно определить общедоступный набор

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

Ответ №2:

Это именно то, что есть sais: для этой переменной не задан метод доступа, и у вас нет реализованного метода Get, который мог бы что-то сделать, чтобы получить вам значение.

Либо перейдите:

 public int Id { get; set; }
  

или

     public int Id
    {
        get
        {
            int something = GetStuffDone();
            return something;
        }
    }
  

Еще что-то, что вы можете сделать, это сделать функцию set закрытой следующим образом:

 public int Id { get; private set; }
  

И ответ на вопрос, почему вы не можете: значение никогда не будет установлено, потому что у него нет средства доступа.

Ответ №3:

Это просто повторение ответов, но ОП не понимает

 public class ViewBannerDTO
{
    public int Id { get; private set; }
    public ViewBannerDTO () 
    {
         Id = 12;  // inside the class can assign private
                   // private not seen outside the classs 
    }
}
  

или вы могли бы

 public class ViewBannerDTO
{
    private int id = 12;
    public int Id { get { return id; } }
}
  

или вы могли бы

 public class ViewBannerDTO
{
    public int Id { get { return 12; }
}
  

Комментарии:

1. tnx. что такое модификатор доступа по умолчанию для set в: public int Id {get;set;} другими словами, если он общедоступен по умолчанию, почему компилятор не принимает «public set;»

2. @Mohammadreza public int. Значение по умолчанию — «public». Вам нужно будет спросить Microsoft, почему вы не можете дважды установить для него значение public.

3. 🙂 В виду, что я прочитал свойство: определите целочисленную переменную и назовите ее Id и определите общедоступный (неявно) или частный (должен быть определен явно) get и общедоступный (неявно) или частный (должен быть определен явно), так почему я не могу явно определить общедоступный набор

4. Задать Майкрософт. Я не писал . Нет. Почему вам нужно явно установить его?

5. 🙂 Д Стэнли ,ответьте на этот пост, alsow ответ на этот комментарий: он доступность, уровень доступа должен быть более строгим, чем уровень доступности на свойство или индексатор себя. <а href =» link msdn.microsoft.com/en-us/library/… >

Ответ №4:

Как в C#, 9 вы можете сделать только для чтения поведение с помощью команды init доступа. Например:

 public class Foo
{
    public int Bar { get; init;} = 1
    public int Baz { get; private init;} = 2
}

var foo = new Foo { Baz = 3};
  

В обоих случаях свойство может быть установлено только во время построения объекта. Ключевое слово private гарантирует, что только класс может установить значение, в противном случае вызывающий new может установить значение с помощью объектной литеральной нотации в примере.

ссылка:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/init