【问题标题】:what is the value of an object and when could it be null?对象的值是什么,什么时候可以为空?
【发布时间】:2012-12-14 13:58:57
【问题描述】:

我开始了解对象的数组,但遇到了一些困难。 我找到了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 变量(它是一个计数器)未初始化,但它的工作没有任何问题。为什么没问题?

【问题讨论】:

  • “我的问题是 p 什么时候可以为空?” ...只要调用方代码是 Add(null);。这与 m_Counter 不同,它是 int 类型,它是一个 值类型,而 Person 是一个 reference 类型跨度>
  • 这是一个讨论变量默认值的页面。这有点令人困惑,因为他们声称您不能使用未初始化的变量,但我认为这意味着只有当他们没有默认构造函数时...msdn.microsoft.com/en-us/library/83fhsxwc(v=vs.80).aspx

标签: c# arrays object instance


【解决方案1】:

如果 p 不为 null,它必须已经实例化,例如 ..g

var p = new Person();

您不能为p 设置任何值以使其不是null,必须先对其进行实例化,然后才能对其设置值。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      m_Counter 是一个具有默认值的原生类型。 对于整数,它将为零

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

      一样初始化它
      Person p = new Person();
      

      在调用 Add 方法之前

      【讨论】:

      • 如果你写 m_Counter = default(int),m_Counter 的值为 0
      【解决方案4】:

      每个变量在声明时都会使用默认值进行初始化(C# 规范中的第 5.2 节。),因为 m_counter 是一个 int,所以其默认值为 0(第 4.1.2 节)。
      编译器不会抱怨,因为 m_counter 被认为是在创建新实例后立即分配的(第 5.3.1 节)。

      【讨论】:

        【解决方案5】:

        如果你写,p 可能为空:

        Person p = null;
        

        m_Counter 似乎是类范围内的一个变量,所以可以在代码的另一部分进行初始化,例如:

        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;
            }  
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-24
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 2014-12-08
          • 2021-12-03
          相关资源
          最近更新 更多