繁体   English   中英

如何在C#中将auto-property初始化为非null?

[英]How to initialize auto-property to not null in C#?

我有一个属性:

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

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

我如何在属性本身进行空检查,如果它为null,它会给我一个新的? 同时保持自动财产模式。

谢谢!

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

MyProp = new Dictionary<string,string>();

您可以在构造函数中初始化它:

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

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

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

在这里,您已使用内部setter创建字典。 在此之后,如果要向字典添加元素,可以在代码中执行此操作:

InstanceOfMyClass.MyProp.Add(blah, blah);

在哪里使用getter获取字典对象,然后执行Add以添加新项。 你不能从代码中调用setter并意外地删除字典,因为它看起来只能读取MyClass之外的任何内容。

对于其他人来说这个旧问题,C#6.0中有一个新功能。

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

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

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

在构造函数中初始化它

public MyClass(){  dictionary = new
 Dictionary<string,string>() 
}

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

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

如果您要运行此代码,则会得到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>();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM