2016-08-31 14 views
1

私は私のクラスに構造があるとします。クラスのみクラス外で読み込まれ、変数とフルアクセス

class MyClass 
{ 
    public struct MyStruct_t 
    { 
     public int someValue1; 
     public int someValue2; 
    } 
    public MyStruct_t MyStruct; 
    public InitStructure() 
    { 
     MyStruct.someValue1 = 1; 
     MyStruct.someValue2 = 1; 
    } 
} 

私はこの構造は唯一の唯一の外部から読み込まれ、クラス内読み取り/書き込みされます欲しいです。このように:

MyClass cls = new MyClass(); 
cls.InitStructure(); 
int value = cls.MyStruct.someValue1; 
cls.MyStruct.someValue2 = value; // here must be an error 

私はそれがC++でfriendキーワードのようなものでなければなりませんね。どうやってやるの?

+1

実際には: 'cls.MyStruct.someValue2 = value; //ここにはエラーがあります.'エラーが発生するはずです。 [this](http://stackoverflow.com/questions/1747654/cannot-modify-the-return-value-error-c-sharp)をご覧ください –

+0

ありがとう、@MongZhu。私は構造が価値によって戻ってくるのであって、参照によってではないことには驚きました。片側から私の問題を解決します。別のサイズから、メンバーにアクセスする必要があるたびに構造体をコピーするのはあまり良いことではありません。私はまだC++の観点から考えているからです。:) – folibis

+0

間違いなく、まずC++の考え方から抜け出すことです。 C++では、 'struct'と' class'はデフォルトのアクセシビリティを除いて実質的に同じです(私が知っている限り)。 C#でプログラミングしようとするなら、それぞれの状況でどちらを使うのかを決定する前に、まずここで 'struct'と' class'が意味するものとそれらの違いを理解してください。 –

答えて

0

public int someValue1 { get; protected set; } public int someValue2 { get; protected set; }

これはおそらくあなたが探しているものです。 protectedキーワードを使用すると、宣言クラスと派生クラスでset操作を使用できますが、他のコンテキストでは使用できません。

+0

私はエラーが発生しました: '設定されたアクセサーにアクセスできないため、このコンテキストでは使用できません。私はその理由は、私は構造自体をオーバーライドしないと思う。 – folibis

+0

申し訳ありませんが、私は最初にあなたの意図を誤解しました。おそらく、次のようにMyClassにアクセサーを追加するべきです: 'public int SomeValue {get {return MyStruct.someValue1; } プロテクトセット{MyStruct.someValue1 = value; } } ' これがうまくいく場合、私は自分の答えを編集します。 –

+0

はい、それは機能しますが、私の考えは、構造内のいくつかのプロパティのセットをグループ化することでした。私の実際のプロジェクトでは、私は数十を持っています。 – folibis

0

あなたはそれを行うことができます。

class MyClass 
{ 
    internal struct MyStruct_t 
    { 
     public readonly int someValue1; 
     public readonly int someValue2; 
     public MyStruct_t(int i, int j) 
     { 
      someValue1 = i; 
      someValue2 = j; 
     } 
    } 
    public MyStruct_t MyStruct; 
    public void InitStructure() 
    { 
     MyStruct = new MyStruct_t(1, 1); 
    } 
} 

しかし、あなたはMyClassからsomeValueXを変更することはできません。これはあなたを助けるかもしれません:https://stackoverflow.com/a/14650082/6479770

関連する問題