none
自動実装プロパティ宣言の違いについて RRS feed

  • 質問

  • 初歩的な質問で申し訳ありません。
    ①と②の違いは何ですか?
    メリットデメリット等はあるのでしょうか?


    Property hoge() As String
    Get
    Return "Empty"
    End Get
    End Property



    Private _hoge2 As String = "Empty"
    Property hoge2() As String
    Get
    Return _hoge2
    End Get
    End Property
    2021年2月3日 12:58

回答

  • 最初の質問のように「ReadOnly」キーワードを記述していなかった場合には、下記のように Set/Get ブロックの両方が必須となります(ブロックの並び順は Get/Set でも Set/Get でも構いません)。

    ちなみに Set ブロックだけのプロパティの場合には「WriteOnly」キーワードが必要です。

    Property hoge() As String
        Get
            Return "Empty"
        End Get
        Set(value As String)
        End Set
    End Property

    …ということで、私の投稿した方の①~④で説明させていただきますね。


    そもそも「自動実装プロパティ(auto-implemented properties)」と呼ばれるのは④の構文のことを指します。
    ①~③は自動実装ではありません

    また、②と③はよく似ていますが、フィールド変数が ReadOnly であるかどうかという違いがあります。

    ①と②は、どちらも値を変更できませんので、機能面で言えば同一と見なせます。
    しかし①の方ではフィールド変数が生成されていないわけですから、完全に同一というわけでもありません。

    そして、「自動実装プロパティ」たる④についてですが、これは ③と同義となります。
    ④の場合、『Me._hoge4 = "XYZ"』のようにすることで、Me.hoge4 の値を書き換えられることから、①や②の動作とは異なることに注意してください。

    自動実装プロパティにおいては、「バッキング フィールド(backing fields)」が用意されており、暗黙的に「Private _hoge4 As String」が定義される仕様です。もしも _hoge4 というメンバーが既にあると、競合によってコンパイルエラー BC31061 となります。

    2021年2月3日 13:39

すべての返信

  • それって構文エラーになりますよね。

    提示されたコードがそもそも間違っていませんか?

    ReadOnly Property hoge() As String
        Get
            Return "Empty"
        End Get
    End Property
    


    Private ReadOnly _hoge2 As String = "Empty"
    ReadOnly Property hoge2() As String
        Get
            Return _hoge2
        End Get
    End Property


    Private _hoge3 As String = "Empty"
    ReadOnly Property hoge3() As String
        Get
            Return _hoge3
        End Get
    End Property

    ④ 自動実装プロパティ

    ReadOnly Property hoge4() As String = "Empty"

    2021年2月3日 13:19
  • 最初の質問のように「ReadOnly」キーワードを記述していなかった場合には、下記のように Set/Get ブロックの両方が必須となります(ブロックの並び順は Get/Set でも Set/Get でも構いません)。

    ちなみに Set ブロックだけのプロパティの場合には「WriteOnly」キーワードが必要です。

    Property hoge() As String
        Get
            Return "Empty"
        End Get
        Set(value As String)
        End Set
    End Property

    …ということで、私の投稿した方の①~④で説明させていただきますね。


    そもそも「自動実装プロパティ(auto-implemented properties)」と呼ばれるのは④の構文のことを指します。
    ①~③は自動実装ではありません

    また、②と③はよく似ていますが、フィールド変数が ReadOnly であるかどうかという違いがあります。

    ①と②は、どちらも値を変更できませんので、機能面で言えば同一と見なせます。
    しかし①の方ではフィールド変数が生成されていないわけですから、完全に同一というわけでもありません。

    そして、「自動実装プロパティ」たる④についてですが、これは ③と同義となります。
    ④の場合、『Me._hoge4 = "XYZ"』のようにすることで、Me.hoge4 の値を書き換えられることから、①や②の動作とは異なることに注意してください。

    自動実装プロパティにおいては、「バッキング フィールド(backing fields)」が用意されており、暗黙的に「Private _hoge4 As String」が定義される仕様です。もしも _hoge4 というメンバーが既にあると、競合によってコンパイルエラー BC31061 となります。

    2021年2月3日 13:39
  • コードがそもそも間違っていました。申し訳ありません。

    メンバ変数を作成して値を返す場合と

    そのまま値を返す場合とで何が違うのか分からなかったのですが

    一緒なんですね...ありがとうございます!

    2021年2月16日 10:54