9

我有一个财产:

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

当我调用该属性来添加一个项目时,我得到一个 NullReferenceException。

我将如何对属性本身进行 null 检查,以便在它为 null 时给我一个新的?同时保持自动属性模式。

4

8 回答 8

6

如果没有显式的私有变量,唯一的另一种方法是向类的构造函数添加一些代码:

MyProp = new Dictionary<string,string>();
于 2011-04-10T17:05:24.487 回答
5

您可以在构造函数中对其进行初始化:

public MyClass()
{
  MyProp = new Dictionary<string, string>();
}
于 2011-04-10T17:05:59.240 回答
3

我不认为你会想要一个 setter,因为它总是会创建一个新的字典,正如其他人通过在构造函数中调用 setter 所指出的那样。更好的方法是:

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

在这里,您使用了内部设置器来创建字典。在此之后,如果您想向字典中添加一个元素,您可以在代码中执行此操作:

InstanceOfMyClass.MyProp.Add(blah, blah);

您在其中使用 getter 获取字典对象,然后执行 Add 以添加新项目。您不能从代码中调用 setter 并意外清除字典,因为它对 MyClass 之外的任何内容都是只读的。

于 2011-04-10T17:17:33.470 回答
3

对于其他陷入这个老问题的人来说,C# 6.0 中有一个新特性。

在 C# 6.0 中,您还可以在同一语句中将该属性初始化为某个常量值,如下所示:

public Dictionary<string, string> MyProp { get; set; } = new Dictionary<string, string>();
于 2016-08-12T08:51:30.673 回答
2

在构造函数中初始化它

public MyClass(){  dictionary = new
 Dictionary<string,string>() 
}
于 2011-04-10T17:04:58.833 回答
1

您将必须使用显式支持字段,您不能更改自动属性的 getter 或 setter。

于 2011-04-10T17:04:06.213 回答
1

有一个名为的属性类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);
    }
}

我没有对此进行测试,某些类型可能存在问题,但我会留给您考虑和判断。如果您决定实施这一点,那么肯定可以进行改进。

于 2011-04-10T17:14:15.207 回答
1

如果您要运行此代码,您将收到 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>();
        }
    }
}
于 2011-04-10T17:16:04.137 回答