Как инициализировать авто-свойство, чтобы не нуль в C #? - PullRequest
8 голосов
/ 10 апреля 2011

У меня есть свойство:

public Dictionary<string, string> MyProp { get; set; }

Когда я вызываю это свойство для добавления элемента, я получаю исключение NullReferenceException.

Как мне сделать проверку на ноль в самом свойствеэто дает мне новый, если он нулевой?При сохранении в шаблоне авто-свойств.

Спасибо!

Ответы [ 8 ]

6 голосов
/ 10 апреля 2011

Без явной закрытой переменной единственным другим способом было бы добавить некоторый код в конструктор класса:

MyProp = new Dictionary<string,string>();
3 голосов
/ 10 апреля 2011

Вы можете инициализировать его в своем конструкторе:

public MyClass()
{
  MyProp = new Dictionary<string, string>();
}
2 голосов
/ 10 апреля 2011

Я не думаю, что вам понадобится установщик, поскольку он всегда будет создавать новый словарь, как другие указывали, вызывая установщик в конструкторе. Лучший подход:

public Dictionary<string, string> MyProp { get; internal set; }
public MyClass() { MyProp = new Dictionary<string, string>(); }

Здесь вы использовали внутренний установщик для создания словаря. После этого, если вы хотите добавить элемент в словарь, вы должны сделать это в своем коде:

InstanceOfMyClass.MyProp.Add(blah, blah);

, где вы используете метод получения, чтобы получить объект словаря, затем выполните Добавить, чтобы добавить новый элемент. Вы не можете вызвать сеттер из своего кода и случайно уничтожить словарь, потому что он будет выглядеть только для чтения за пределами MyClass.

1 голос
/ 12 августа 2016

Для других людей, которые задумались над этим старым вопросом, в C # 6.0 появилась новая функция.

В C # 6.0 вы также можете инициализировать это свойство некоторым постоянным значением в том же выражении, например:

public Dictionary<string, string> MyProp { get; set; } = new Dictionary<string, string>();
1 голос
/ 10 апреля 2011

Если бы вы запустили этот код, вы бы получили исключение NullReferenceException, потому что поле никогда не инициализируется.

class Program
{
    static void Main(string[] args)
    {
        Person sergio = new Person();
        sergio.Items.Add("test", "test");

        Console.ReadKey();
    }

    public class Person
    {
        public Dictionary<string, string> Items { get; set; }
    }
}

Таким образом, один из способов решить эту проблему - инициализировать его в конструкторе класса.

class Program
{
    static void Main(string[] args)
    {
        Person sergio = new Person();
        sergio.Items.Add("test", "test");

        Console.ReadKey();
    }

    public class Person
    {
        public Dictionary<string, string> Items { get; set; }

        public Person()
        {
            Items = new Dictionary<string, string>();
        }
    }
}
1 голос
/ 10 апреля 2011

Существует класс атрибута с именем DefaultValueAttribute, который позволяет вам указать желаемое значение по умолчанию для члена, однако он автоматически не устанавливает для члена указанное значение; Однако надежда не теряется, поскольку вы можете использовать отражение, чтобы получить это значение во время выполнения и применить его, как изложено в этом углу Интернета :

static public void ApplyDefaultValues(object self)
{
    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(self))
    {
        DefaultValueAttribute attr = prop.Attributes[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
        if (attr == null) continue;
        prop.SetValue(self, attr.Value);
    }
}

Я не проверял это, и могут быть проблемы с определенными типами, но я оставлю это на ваше усмотрение и усмотрение. Если вы решите внедрить это, тогда улучшения могут быть сделаны.

1 голос
/ 10 апреля 2011

Инициализируйте его в конструкторе

public MyClass(){  dictionary = new
 Dictionary<string,string>() 
}
1 голос
/ 10 апреля 2011

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

...