Свойство ReadOnly С#

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

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

но зачем:

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

и почему я не могу:

public readonly int Id{get;}
3 ответа

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

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

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

public readonly int Id{get;}

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

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

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


Это всего лишь повторение ответов, но OP не понимает

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; }
}


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

Или идите:

public int Id { get; set; }

ИЛИ

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

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

public int Id { get; private set; }

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

licensed under cc by-sa 3.0 with attribution.