C# 属性中的Do while循环导致堆栈

C# 属性中的Do while循环导致堆栈,c#,exception,null,C#,Exception,Null,我最近开始尝试自学C#,这在很大程度上是一个初学者尝试在属性(我的例子是FurColor)中使用业务规则。当我运行下面的程序时,我得到一个NullReferenceException。有人能帮我找到这个错误的原因吗?异常发生在第15行 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _10_23_Test { class Program

我最近开始尝试自学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; }
        }

    }
}

在访问其
furColor.Length

之前,请检查furColor是否为null,然后再访问其
furColor.Length
您的代码没有任何意义,但这没关系,因为您正在学习如何编码。:)


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

您编写的代码没有任何意义,但它是正常的,因为您正在学习如何编写代码。:)


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

要使您拥有的代码正常工作:您正在访问
furColor.Length
而从未设置furColor…此时它是空的。您应该检查


此外,这不是您希望在属性的setter中使用的逻辑。setter不应该输出读取值,它应该简单地设置属性,因为这就是它的用途。将while循环放在main中。

使您拥有的代码正常工作:您正在访问
furColor.Length
而从未设置furColor…此时它是空的。您应该检查


此外,这不是您希望在属性的setter中使用的逻辑。setter不应该输出读取值,它应该简单地设置属性,因为这就是它的用途。将while循环放在主循环中。

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

旁注:您不应该在属性的Set子句中请求输入

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

在you dog类中添加一个如下所示的函数:

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;
}
public void setFurColor()
{
字符串颜色=string.Empty;
做
{
控制台。写下(“你的狗是什么颜色的:”);
color=Console.ReadLine();
}而(!string.IsNullOrEmpty(color)&&bleh.Length<10);
this.furColor=颜色;
}

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

旁注:您不应该在属性的Set子句中请求输入

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

在you dog类中添加一个如下所示的函数:

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;
}
public void setFurColor()
{
字符串颜色=string.Empty;
做
{
控制台。写下(“你的狗是什么颜色的:”);
color=Console.ReadLine();
}而(!string.IsNullOrEmpty(color)&&bleh.Length<10);
this.furColor=颜色;
}

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

public Dog() { }
此构造函数没有设置
furColor
字段,因此在
Dog
实例中它将为空

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

while (furColor.Length > 10);
解决此异常的一种方法是在无参数构造函数中为这些字段设置默认值,如下所示:

public Dog() : this("brown", "Fido", default(int))
{
}
或者,您可以:

  • 使用带参数的构造函数,为
    furColor
    传递非空值
  • FurColor
    属性设置器中检查null
  • 设置声明的
    字段

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

public Dog() { }
此构造函数没有设置
furColor
字段,因此在
Dog
实例中它将为空

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

while (furColor.Length > 10);
解决此异常的一种方法是在无参数构造函数中为这些字段设置默认值,如下所示:

public Dog() : this("brown", "Fido", default(int))
{
}
或者,您可以:

  • 使用带参数的构造函数,为
    furColor
    传递非空值
  • FurColor
    属性设置器中检查null
  • 设置声明的
    字段

在访问变量长度之前,您的
furColor
变量需要赋值和/或检查空值。因为您使用的是默认构造函数,所以从不将其指定给furColor字符串。 您需要从默认值调用其他构造函数:

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

这就是说,在属性中请求用户输入是不好的编程实践,并且最终会在属性中出现无限循环

在访问变量长度之前,您的
furColor
变量需要赋值和/或检查是否为null。因为您使用的是默认构造函数,所以从不将其指定给furColor字符串。 您需要从默认值调用其他构造函数:

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

这就是说,在属性中请求用户输入是不好的编程实践,并且最终会在属性中出现无限循环

您得到的异常是哪一行?您没有在
FurColor
中分配循环中的任何内容。您得到的异常是哪一行?您没有分配