-2

コードを実行しようとするたびに、「StackOverFlowException によりプロセスが終了しました」というエラーが表示されます。警告を見ると、プロパティに「無限ループまたは無限再帰がないことを確認してください」という警告が表示されます。これが私のコードです:

class Book
{
    public string bokensTittle
    {
        get { return bokensTittle; }
        set { bokensTittle = value; }
    }
    public string forfattareFornamn
    {
        get {return forfattareFornamn;}
        set {forfattareFornamn = value;}  // on this line i get the error
    }

    public string forfattareEfternamn
    {
        get {return forfattareEfternamn;}
        set {forfattareEfternamn = value;;} 
    }

    public int lanseringsDatum
    {
        get { return lanseringsDatum; }
        set { lanseringsDatum = value; }
    }

}

誰でもこれを修正するのを手伝ってもらえますか?

4

6 に答える 6

3

ここには、単純で無限の再帰があります。

両方のプロパティが自分自身にアクセスしています。

それを修正する2つの方法があります:

  1. 自動プロパティ:

    public string ForfattareEfternamn
    {
        get; set;
    }
    
    public int LanseringsDatum
    {
        get; set;
    }
    
  2. バッキングフィールド:

    private string _forfattareEfternamn;
    private int _lanseringsDatum;
    
    public string ForfattareEfternamn
    {
        get { return _forfattareEfternamn; }
        set { _forfattareEfternamn = value; } 
    }
    
    public int LanseringsDatum
    {
        get { return _lanseringsDatum; }
        set { _lanseringsDatum = value; }
    }
    

ところで:大文字で始まるようにプロパティの名前を変更した方法に注意してください。これは、C#のパブリックメンバーに受け入れられている標準です。

于 2013-02-21T08:45:35.263 に答える
2

プロパティの名前は、ゲッターとセッターで使用している名前と一致します。get;set;のみを宣言します。プライベート変数を使用する予定がない場合のステートメント。

class Book
{
    public string bokensTittle
    {
        get;set;
    }
    public string forfattareFornamn
    {
        get;set;
    }

    public string forfattareEfternamn
    {
        get;set;
    }

    public int lanseringsDatum
    {
        get;set;
    }
}
于 2013-02-21T08:46:24.680 に答える
1

これを試して :

public string forfattareEfternamn
{
    get;
    set;
}

public int lanseringsDatum
{
    get;
    set;
}
于 2013-02-21T08:47:50.193 に答える
1

プロパティを呼び出すgetterからプロパティを呼び出しています。

public string forfattareEfternamn
{
    get {return forfattareEfternamn;} <-- here you call property getter again
    set {forfattareEfternamn = value;} 
}

バックストレージを使用する場合は、フィールドとプロパティの名前を変える必要があります(通常、バックストレージの場合はキャメルケース名、プロパティの場合はパスカルケース名)。

private string forfattareEfternamn; // field for storing property value

public string ForfattareEfternamn // property
{
    get {return forfattareEfternamn;} // returning field value
    set {forfattareEfternamn = value;}  // setting field value
}

ただし、あなたの場合は、自動実装されたプロパティを使用するだけです。

public string ForfattareEfternamn { get; set; }

プロパティ(C#プログラミングガイド)を読むことを強くお勧めします

于 2013-02-21T08:45:46.420 に答える
1
 public string forfattareEfternamn
    {
        get; 
        set;
    }

    public int lanseringsDatum
    {
        get;
        set;
    }

自動プロパティはあなたがやろうとしていることだと思います。

于 2013-02-21T08:46:55.150 に答える
1

両方のgetステートメントはそれ自体を参照します。いずれかのプロパティを取得しようとすると、それ自体が何度も取得を呼び出します。これが無限ループであり、スタックオーバーフローの原因です。

代わりに、バッキングフィールドを使用できます。

private string _forfattareEfternamn;

private int _lanseringsDatum;

public string ForfattareEfternamn
{
    get {return forfattareEfternamn;}
    set {forfattareEfternamn = value;;} 
}

public int LanseringsDatum
{
    get { return lanseringsDatum; }
    set { lanseringsDatum = value; }
}

または、プロパティに追加のコードが必要ない場合は、空白のget/setで問題ありません。

public string ForfattareEfternamn
{
    get;
    set;
}

public int LanseringsDatum
{
    get;
    set;
}

(また、最初のセッターには余分なものがあります;)

于 2013-02-21T08:49:31.273 に答える