2012-02-14 16 views
3

なぜエラーは発生しませんか?私はメインprogrmファイル内のこの構造体のプライベートフィールドを変更しようとするとエラーが発生しますが、構造体実装では発生しません。構造体 - プライベートフィールドへのアクセス

public struct MyStruct 
{ 
    private int privateField; 

    public int MyField 
    { 
     get { return privateField; } 
     set { if (value >= 0) privateField = value; else value = 0 } 
    } 

    public void SomeMethod (MyStyruct s) 
    { 
     s.privateField = 10; // no error here. 
    } 
} 

答えて

6

プライベートメンバーはクラスまたは構造体ないオブジェクトに制限されています。この場合、sthisとは異なるオブジェクトですが、それでも動作します。

+0

偉大な答え(7分後に最善の答えを受け入れる)。 Questoion 2:privateFieldを使用してデータを高速に読み取る必要がありますか、MyField C#を使用すると読み込みを最適化しますか? – zgnilec

+1

そのようなマイクロ最適化について心配する必要はありません。コピーコンストラクタを作成していない場合は、このプロパティを使用します。特にあなたのセッターには特別なロジックがあります。 – Osiris

+0

MyFieldとは対照的に、privateFieldを使用することでパフォーマンスが向上するとは思いません。私が心配している限り、他のものよりも優先させる特定の理由(ゲッターやセッターの特別なロジック)がない限り、それはスタイルの問題です。 –

3

privateはそれだけstructの範囲で使用することができることを意味します。この変数のアクセスレベルが関数privateで、struct自身にしかないというアクセス修飾子です。

構造体の外でプロパティを変更する場合は、たとえばmainにする必要があります。

あなたのメソッドSomeMethodは構造体の一部ですので、プライベートメンバーを変更することができます。

あなたがアクセスしている方法は少し珍しいですが。

4

この動作は構造体に固有のものではありません。クラスにも当てはまります。

privateは、フィールドがそのタイプ内でのみアクセス可能であることを意味します。これは、同じタイプの ""内のみを意味するものではありません。

の異なるインスタンスでも、同じタイプのからプライベートフィールドにアクセスしようとしている場合、privateはアクセスを許可する必要があります。

1

SomeMethodは構造体自体のメソッドです。クラスでエラーが発生することはありません。ローカルメンバーはプライベートフィールドを変更することができます。

1

private修飾子は、メンバーがそのタイプ内からのみアクセスできることを意味します。そのインスタンスの中へのアクセスを制限しません。

3

まず、構造体であるかクラスであるか、それともフィールドか他のメンバーかはまったく関係ありません。

C#でのアクセシビリティは、コードがどこにあるかに基づいて決定され、「このオブジェクト」か別のオブジェクトではありません。

詳細については、C#仕様のセクションセクション3.5を参照してください。例えば、3.5.2から:

アクセシビリティドメインメンバのが許可されている部材にアクセスするプログラムテキストの(おそらく互いに素)セクションから構成されています。

[...]

Mの宣言アクセシビリティprivateであれば、MのアクセシビリティドメインはTのプログラムテキストです。

+0

ありがとう、私は多くのドキュメントを読んでいますが、私の英語は上級レベルではありません。 – zgnilec

1

渡された型もMyStructであるため、これは許可されています。この構造体は、同じ型の構造体からプライベートメンバーにアクセスできます。

他の人も指摘しているように、この動作はクラスタイプでも同じです。

関連する問題