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

アクセスする前に、null に対してfurColorをチェックしてくださいfurColor.Length

于 2012-10-23T19:47:44.810 に答える
1

コーディングは意味がありませんが、コーディングの方法を学んでいるので問題ありません。:)

したがって、ユーザーが 10 文字を超える長さの文字列を入力した場合にのみ、furColor を保存したいと思います。その場合は、値をオブジェクト プロパティに代入する前に文字列に問題がないかどうかを確認し、そうでない場合は、クラス プロパティ コードの OUTSIDE という警告メッセージでループします。

于 2012-10-23T19:50:23.633 に答える
1

あなたが持っているコードを機能させるには:furColor.Length毛皮の色を設定せずにアクセスしています...その時点では何もありません(null)。チェックする必要がありますvalue

さらに、これはプロパティのセッターに必要な種類のロジックではありません。セッターは読み取り値を出力するべきではありません。それが目的であるため、単にプロパティを設定する必要があります。while ループをメインに配置します。

于 2012-10-23T19:51:26.750 に答える
1

Dog の public パラメータなしコンストラクタを使用しています

public Dog() { }

furColorこのコンストラクターはフィールドを設定しないため、Dogインスタンスでは null になります。

これはfurColor、次の行でフィールドの Length プロパティにアクセスすると、NullReferenceException がスローされることを意味します。

while (furColor.Length > 10);

この例外を回避する 1 つの方法は、次のように、パラメーターなしのコンストラクターでこれらのフィールドに既定値を設定することです。

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

または、次のこともできます。

  • コンストラクターをパラメーターと共に使用し、 に null 以外の値を渡します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 に答える