7

C#では、プライベート変数を宣言する必要なしにプロパティを持つことができます。このように見えた私のVB6コード

'local variable(s) to hold property value(s)
Private mvarPhoneNumber As String 'local copy
Public Property Let PhoneNumber(ByVal vData As String)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.PhoneNumber = 5
    mvarPhoneNumber = vData
End Property


Public Property Get PhoneNumber() As String
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.PhoneNumber
    PhoneNumber = mvarPhoneNumber
End Property

これで、次のようになります。

public string PhoneNumber{get;set;}

C#のgetterメソッドとsetterメソッドに検証を入れるにはどうすればよいですか?このような検証を追加してみました。

public string PhoneNumber
        {
            get
            {
                return PhoneNumber;
            }
            set
            {
                if (value.Length <= 30)
                {
                    PhoneNumber = value;
                }
                else
                {
                    PhoneNumber = "EXCEEDS LENGTH";
                }
            }
        }

このコードのget部分はコンパイルされません。プライベート変数の使用に戻す必要がありますか?

4

5 に答える 5

18

はい、バッキングフィールドを作成する必要があります。

string _phoneNumber;

public string PhoneNumber
{
    get
    {
        return _phoneNumber;
    }
    set
    {
        if (value.Length <= 30)
        {
            _phoneNumber = value;
        }
        else 
        {
            _phoneNumber = "EXCEEDS LENGTH";
        }
    }
}

この実装は、自動的に実装されたプロパティと同じであることに注意してください。自動的に実装されたプロパティを使用すると、コンパイラがバッキングフィールドを作成できるようになります。にカスタムロジックを追加する場合、getまたはset上記のようにフィールドを自分で作成する必要がある場合。

于 2010-11-30T20:36:30.307 に答える
2

必ずしもローカル変数は必要ありません。get理論的には、 /setプロパティ内に必要な機能を実装できます。getただし、この例では、 /プロパティに再帰的にアクセスできますが、set実装方法には意味がありません。したがって、具体的なケースでは、ローカル変数が必要になります。そうです。

于 2010-11-30T20:40:41.833 に答える
2

NullReferenceExceptionコード全体を短くするだけでなく、回避するために、このようなことをします。

public string PhoneNumber
{
    get { return _phoneNumber; }
    set 
    {
        var v = value ?? string.Empty; 
        _phoneNumber = v.Length <= 30 ? v : "EXCEEDS LENGTH"; 
    }
}
private string _phoneNumber;
于 2010-11-30T20:41:11.587 に答える
1

そうです。ショートカットの「暗黙の」構文を使用すると、_phoneNumberというバッキングフィールドが密かに作成されます。プロパティを明示的に定義する場合は、独自のバッキングフィールドを作成する必要があります。プロパティ定義のすぐ上に次のように配置します。

private string _phoneNumber;

そして、あなたの財産で使用してください:

get
{
    return _phoneNumber;
}
于 2010-11-30T20:37:50.890 に答える
1

いくつかの多くの選択肢をここで探してください: 自動車プロパティのバッキングフィールドにアクセスする

しかし、簡単な答えは「はい」です。検証用のバッキングフィールドが必要になります。

于 2010-11-30T20:39:47.410 に答える