10

プロパティを保持するためにクラス レベルの変数を宣言する必要がありますself.{propertyname}か?それとも、getter/setter で参照するだけでよいですか?

言い換えれば、私はこれを行うことができますか?(どこにも定義していませんmongoFormId):

public string mongoFormId 
{
    get
    {
        return this.mongoFormId;
    }
    set
    {
        this.mongoFormId = value;
        revalidateTransformation();
    }
}
4

8 に答える 8

20

自動アクセサーを使用することも、独自のアクセサー実装することもできます。自動アクセサーを使用する場合、C# コンパイラはバッキング フィールドを生成しますが、独自のアクセサーを実装する場合は、バッキング フィールドを手動で提供する (または値を別の方法で処理する) 必要があります。

private string _mongoFormId;

public string mongoFormId 
{
    get { return this._mongoFormId; }
    set 
    {
        this._mongoFormId = value;
        revalidateTransformation();
    }
}

更新:この質問がされてから、C# 6.0 がリリースされました。ただし、新しい構文 optionsを使用しても、バッキング フィールドを明示的に宣言せずにカスタム セッター本体を提供する方法はまだありません。

于 2013-06-21T15:16:43.463 に答える
0

プロパティへの再帰呼び出しを取得するため、これは機能しません。私が間違っていなければ、結果はStackOverflowException. 変数を使用する必要があります。

    private string mongoFormId;
    public string MongoFormId 
    {
        get
        {
            return this.mongoFormId;
        }
        set
        {
            this.mongoFormId = value;
            revalidateTransformation();
        }
    }

を実行する必要がない場合はrevalidateTransformation、自動プロパティを使用できます。これにより、バックグラウンドでバックファイルが作成されます。

public string MongoFormId { get; set; }
于 2013-06-21T15:18:14.703 に答える
0

あなたが書いたコードでは、get と set の両方で再帰的な無限ループを作成しています。thisキーワードは、現在のプロパティではなく、現在のクラスを参照します。

はい、プライベート フィールドを宣言する必要があります。また、混乱を避けるために、MSDN 命名ガイドラインに従ってプロパティを作成してください (プロパティにはパスカル ケースを使用し、プライベート フィールドにはキャメル ケースを使用してください)。また、メソッドについても同じことを行ってください。Java のRevalidateTransformation代わりrevalidateTransformationに C# の規則に従っている場合は、そうする必要があります。

private string mongoFormId;
public string MongoFormId 
{
    get 
    { 
        return mongoFormId; 
    }
    set 
    {
        mongoFormId = value;
        RevalidateTransformation();
    }
}
于 2013-06-21T15:20:26.480 に答える
0
public string mongoFormId {
    get {
        return this.mongoFormId;
    }
    set {
        this.mongoFormId = value;
        revalidateTransformation();
    }
}

このようにして、すべてのパスで関数を再帰的にします 。唯一の方法は、プライベート データ メンバーを使用することです。他の男の子が言うように。

于 2013-06-21T15:28:21.093 に答える
0

両方の方法で行うことができます。

クラスレベルのメンバー変数が必要な場合は、次のようにします-

public class sampleClass
{
     private string _mongoFormId;

public string mongoFormId {
            get { return _mongoFormId; }
            set {
                _mongoFormId = value;
                revalidateTransformation();
            }
        }
}

または、 revalidateTransformation() 実行呼び出しが必要ない場合は、クラスでこれを簡単に行います

public class sampleClass
{
public string mongoFormId {get; set;}
}
于 2013-06-21T15:21:08.873 に答える
0

MSDN プロパティの概要を確認する

通常、プロパティ定義にはプライベート データ メンバーが含まれますが、これは必須ではありません。get アクセサーは、プライベート データ メンバーにアクセスせずに値を返すことができました。1 つの例は、get メソッドがシステム時間を返すプロパティです。プロパティはデータの隠蔽を可能にし、アクセサ メソッドはプロパティの実装を隠蔽します。

于 2013-06-21T15:16:39.643 に答える