4

取得と設定では異なるアクセス レベルが必要になるという理由だけで、ゲッターとセッターを書いていることがよくあります。そして、これらのゲッターとセッターは簡単です (ゲッターは返すだけで、セッターは値を設定するだけで、内部に他のコードはありません)。フィールド値を外部に対してのみ読み取りたい場合の典型的なケース (そして、すべてのフィールドに対して大量の getter 関数を記述します)。

ゲッターとセッターは内部の関数です。また、関数の呼び出しは、引数のコピー、スタック フレームのプッシュとポップ、結果のコピーなどを行う必要があるため、フィールドを設定するよりも時間がかかります。

まあ、コンパイラは関数呼び出しを最適化し、代入をインライン化するかもしれませんが、これは制御できません。C++ の inline キーワードでさえヒントに過ぎず、コンパイラはそれを自由に無視できます。関数が呼び出され、それが遅くなると想定する必要があります。

さらに、言語 (C# など) はプロパティをサポートせず、このことを模倣することはありませんが、それらはフィールドのように見える関数にすぎず、それが関数またはフィールドであることさえわかりません (IDE の助けがなければ)。

カプセル化の独断的な原則に違反することを伝えるだけでなく、書き込みと読み取りに異なるアクセス修飾子を設定できたら (たとえば、ファイル システムが行うように)、どのような問題が発生するでしょうか?

4

1 に答える 1

5

ただし、C# では、getter と setter に異なるアクセス権を持つプロパティを作成できます。

public int Foo {
    get { return foo; }
    protected set { foo = value; }
}

protected int Bar { get; private set; }

1 つ目はパブリック ゲッターと保護されたセッターでプロパティ「Foo」を作成し、2 つ目は保護されたゲッターとプライベート セッターでプロパティ「Bar」を作成します。

Objective-C に関しては、プロパティを宣言してからクラス拡張またはサブクラスでreadonly再宣言できるようにすることで、一般的なケース (「パブリック」ゲッター、「プライベート」セッター) に特化した言語です。readwrite

他に考えている言語は何ですか?

于 2011-05-14T13:00:17.490 に答える