1

我最近开始尝试自学 C#,这在很大程度上是初学者尝试在属性中使用业务规则的尝试,在我的例子中是 FurColor。当我运行下面的程序时,我得到一个NullReferenceException. 有人可以帮我找出这个错误的原因吗?异常发生在第 15 行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _10_23_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("programming practice!");
            Dog d = new Dog();
            Console.Write("what color is your dog: ");
            d.FurColor = Console.ReadLine();
            Console.WriteLine("the color of your dog is {0}", d.FurColor);
        }
    }
    class Dog
    {
        private string furColor;
        private string petName;
        private int tagNum;

        public Dog() { }

        public Dog(string color, string name, int tagID)
        {
            furColor = color;
            petName = name;
            tagNum = tagID;
        }
        //properties
        public string FurColor
        {
            get { return furColor; }
            set {                    
                    do
                    {
                        Console.Write("enter in a viable color type: ");
                    }
                    while (furColor.Length > 10);
                    furColor = value;
                }
        }
        public string Name
        {
            get { return petName; }
            set { petName = value; }
        }
        public int TagNum
        {
            get { return tagNum; }
            set { tagNum = value; }
        }

    }
}
4

6 回答 6

2

一旦更正,您将得到一个无限循环。

旁注:您不应该在您的财产的 Set 子句中要求输入。

您应该更喜欢要求输入的成员函数,检查它是否有效,然后设置颜色。

在你的狗类中添加一个如下所示的函数:

public void setFurColor()
{
    string color = string.Empty;
    do
    {
        Console.Write("what color is your dog: ");
        color = Console.ReadLine();
    }while ( ! string.IsNullOrEmpty(color)  && bleh.Length < 10);
    this.furColor = color;
}
于 2012-10-23T19:51:35.677 回答
1

在访问它之前检查furColor是否为 nullfurColor.Length

于 2012-10-23T19:47:44.810 回答
1

你的代码没有任何意义,但没关系,因为你正在学习如何编码。:)

所以 - 我猜你只想在用户输入长度大于 10 个字符的字符串时存储 furColor。如果是这样,您应该在将值分配给对象属性之前检查字符串是否正常,如果不是,则在类属性代码之外循环显示警告消息。

于 2012-10-23T19:50:23.633 回答
1

要使您拥有的代码起作用:您furColor.Length无需设置毛皮就可以访问...此时它什么都不是(null)。你应该检查一下value

此外,这不是您在属性的 setter 中想要的那种逻辑。您的设置器不应该输出读数值,它应该简单地设置属性,因为这就是它的用途。将while循环放在你的main中。

于 2012-10-23T19:51:26.750 回答
1

您正在使用 Dog 的公共无参数构造函数

public Dog() { }

此构造函数不设置该字段,因此在您的实例furColor中它将为空。Dog

这意味着访问furColor以下行中字段的 Length 属性将引发 NullReferenceException。

while (furColor.Length > 10);

解决此异常的一种方法是在无参数构造函数中为这些字段设置默认值,如下所示:

public Dog() : this("brown", "Fido", default(int))
{
}

或者,您可以:

  • 使用带参数的构造函数,为 . 传入一个非空值furColor
  • 检查FurColor属性设置器中的 null。
  • 设置field它的声明位置。
于 2012-10-23T19:52:13.943 回答
1

您的furColor变量需要在访问其长度之前被分配和/或检查是否为 null。由于您使用的是默认构造函数,因此您永远不会分配给 furColor 字符串。你会想从默认调用你的其他构造函数:

public Dog() : this("defaultColor", "defaultName", default(int)) {}

话虽如此,在属性中要求用户输入并不是一种好的编程习惯,并且最终会在属性中出现无限循环。

于 2012-10-23T19:52:35.510 回答