String Reference = null我不明白

时间:2014-01-10 10:44:38

标签: c#

非常简单的设置。

public ObservableCollection<ParentNode> CreateTreeViewCollection(string ClassName)
{
    EnumerateFullData AllData = new EnumerateFullData() { ClassName = ClassName.Clone() };
}

public class EnumerateFullData
{
    public Object ClassName { get; set; }
    public List<PropertyData> Properties { get; set; }
}

创建对象时,ClassName值为null,即使它在我创建的类之前有值。 一旦类完成并且调试器返回到原始类,则值再次出现。 我认为这与实例产生有关,有人可以建议我如何将这个引用传递给新创建的类吗?

3 个答案:

答案 0 :(得分:2)

在创建对象后分配ClassName值,因为use正在使用类初始值设定项。如果要在对象创建期间分配值,请使用构造函数。此外,如果将属性更改为字符串类型,则不需要使用ClassName.Clone(),因为字符串是不可变的。以下代码应该有效:

public ObservableCollection<ParentNode> CreateTreeViewCollection(string ClassName)
{
    EnumerateFullData AllData = new EnumerateFullData(ClassName);
}

public class EnumerateFullData
{
    public EnumerateFullData (string className)
    { 
        ClassName  = className;
    }
    public string ClassName { get; set; }
    public List<PropertyData> Properties { get; set; }
}

答案 1 :(得分:1)

你混合了ClassName EnumerateFullData的属性和ClassName CreateTreeViewCollection的论点;所以你试图克隆null 。更改

的代码
  // Let argument be in the camel case, "className" not "ClassName"
  public ObservableCollection<ParentNode> CreateTreeViewCollection(string className)
  {
    // property "ClassName" is a clone of argument "className"
    EnumerateFullData AllData = 
      new EnumerateFullData() { ClassName = className.Clone() };
  }

答案 2 :(得分:0)

您正在使用对象初始值设定项。它们只是语法糖。写

EnumerateFullData AllData = new EnumerateFullData() { ClassName = ClassName.Clone() };

实际上是这样的:

var temp = new EnumerateFullData();
temp.ClassName = ClassName.Clone();
EnumerateFullData AllData = temp;

首先创建您的类,然后才设置ClassName属性。 您可以在单个中执行此操作,因为编译器会为您执行此操作。 这意味着当创建EnumerateFullData实例时,ClassName实际上是空的。