2012-12-14 237 views
1

我开始了解对象的数组,并且遇到一些困难。 我发现类Person的一个简单的代码和类PersonArray和在PersonArray类的方法之一是这样的(m_Arr是一个Person阵列):对象的值是什么,什么时候可以为空?

public void Add(Person p) 
     { 
      if (p == null) 
       Console.WriteLine("Error, param can't be null"); 
      if (m_Arr.Length <= m_Counter) 
      { 
       Array.Resize(ref m_Arr, m_Arr.Length + 10); 
      } 
      m_Arr[m_Counter++] = p; 
     } 

我的问题为p时可以null?我的意思是什么值可以反对,所以它不会是空的?另外,我还有一个问题 - m_Counter变量(这是一个计数器)没有初始化,但它没有任何问题。为什么它可以?

+0

*“我的问题是什么时候可以为null?”* ...只要调用者代码是“Add(null);'。这与m_Counter是不一样的,它的类型为'int',它是一个**值类型**,与'Person'是相反的,它是一个**引用**类型 –

+0

这是一个页面,讲述有关default变量的值。这有点令人困惑,因为他们声称你不能使用未初始化的变量,但我认为这意味着只有当他们没有默认的构造函数时... http://msdn.microsoft.com/en-us/library/83fhsxwc( v = vs80).aspx – RonaldBarzell

回答

1

对于p不为空它必须被实例化e..g

var p = new Person();

你不能为了设置任何值p它不被null,它之前被实例化你可以设置它的值。

至于m_counter,我猜这是一个整数数据类型,所以它默认为0。

1

如果一个对象没有被实例化,那么它将是NULL。当实例化时,它将是一个人的实例,所以p = new Person()。您也可以将其设置回NULL,如p = null;

1

m_Counter是一个本机类型,它将具有默认值。 对于整数这将是零

p可以是空 不为空,你应该像

Person p = new Person(); 

初始化它调用添加方法

+0

如果你写m_Counter = m_Counter = default(int) – lante

1

每个变量,使用默认值时初始化之前你声明它(在C#规范中是§5.2),因为m_counter是一个int类型,它的默认值是0(§4.1.2)。
编译器不会抱怨,因为只要创建新实例(第5.3.1节),m_counter就被认为是明确分配的。

Person p = null; 

的m_Counter似乎是在类范围的变量,因此它可以在代码中的另一部分被初始化,例如:如果你写

1

p可能是空

class SomeClass 
{ 
    static int m_Counter = 0; 
    static Person[] m_Arr = new Person[] { }; 

    public void Add(Person p) 
    { 
     if (p == null) 
      Console.WriteLine("Error, param can't be null"); 
     if (m_Arr.Length <= m_Counter) 
     { 
      Array.Resize(ref m_Arr, m_Arr.Length + 10); 
     } 
     m_Arr[m_Counter++] = p; 
    } 
} 
相关问题