2016-04-13 12 views
1

そうですね、この質問をするのは本当に馬鹿だと思いますが、私は現在、単純なパスファインダースクリプトを作成中です。Unity C#辞書のカスタムクラス

public class FloorInfo 
{ 
    Floor lastFloor; 
    float floorValue; 

    public FloorInfo(Floor lastF, float val) 
    { 
     lastFloor = lastF; 
     floorValue = val; 
    } } 

しかし、私は

FloorInfo info = new FloorInfo(current, F); 
のようなものを作成した後:私は床は私が参照しています床タイルで、次のようにFloorInfoは、カスタムクラスである

Dictionary<Floor, FloorInfo>

などの辞書を使用したいです

info.valinfo.lastFなどの値を取得できません

あなたは私に間違っていることを私に説明できますか?私はそのようなことや過去45分にこだわってしまったのは本当に厄介です。

編集:はい、既にお返事いただきありがとうございます。最も明白なもののようにもかなり問題があるようです。おかげさまで、ありがとうございました!

+1

これらのプロパティは 'private'あり、デフォルトではので、あなたは外からアクセスできないすなわち、任意の_access modifier_('プライベート/保護/ public')を指定していませんクラス。 – Crozin

答えて

1

クラス外からアクセスしたい場合は、公開します。

1

これは、C#クラスのフィールドのアクセス修飾子(デフォルト)がprivateであるためです。上記の操作はclassの範囲外のprivateフィールドにアクセスしようとしています(許可されていません)。その後、あなたはclassスコープの外でそれらにアクセスすることができ、publicそのアクセス修飾子を作り、フィールドにアクセスするには

public class FloorInfo 
{ 
    public Floor lastFloor; //note the public keyword 
    public float floorValue; 

    public FloorInfo(Floor lastF, float val) 
    { 
     lastFloor = lastF; 
     floorValue = val; 
    } 
} 

そして単になどの分野へのアクセス:

FloorInfo info = new FloorInfo(current, F); 
info.lastFloor = new Floor(); 
info.floorValue = 45.0; 

注ことを単純にコンストラクタのパラメータであるため、上記のlastFvalにはアクセスしないでください。コンストラクタのパラメータではなく、クラスのフィールドにアクセスします。

これは、fieldではなくpropertyとしてアクセスする方が一般的です。

public Floor lastFloor { get; set; } 
public float floorValue { get; set; } 

propertyで、あなたは、ほとんどの時間であり、これは、より安全な設計(たとえば、あなたの財産のための入力が有効であるかどうかをチェックするように)あなたのgettersetterで何かを設定することができますので、これは次のとおりです。

const float floorValueLimit = 20.0; 
private float pFloorValue; 
public float floorValue { 
    get { return pFloorValue; } 
    set { 
    if (value <= floorValueLimit){ //check limit 
     pFloorValue = value; 
    } //else, don't update 
    } 
} 

ただし、フィールドを使用してこれを行うことはできません。

はまた、追加のサイドノートとして、publicフィールドは、通常、C#、一般的な命名規則では、その最初の文字に大文字を持っているでしょう:

public class FloorInfo 
{ 
    public Floor LastFloor; //note the public keyword 
    public float FloorValue; 

    public FloorInfo(Floor lastF, float val) 
    { 
     lastFloor = lastF; 
     floorValue = val; 
    } 
} 
1

lastFvalはあなたのコンストラクタにパラメータです。これらは、コンストラクターが完了するとすぐになくなります。

これらの値をlastFloorとfloorValueにコピーしましたが、現在はプライベートです。これらを公開する必要があります。修飾子を指定しないと、デフォルトではprivateになり、定義されているクラスの外には表示されません。

public class FloorInfo 
{ 
    public Floor lastFloor; 
    public float floorValue; 

    public FloorInfo(Floor lastF, float val) 
    { 
     lastFloor = lastF; 
     floorValue = val; 
    } 
} 

ので、あなたは、あなたが良いデザインをしたいなら、あなたはプロパティにこれらを行う必要があり、おそらくそれがFloorInfoクラスの外で変更することはできません、彼らはのでsetをプライベートにinfo.floorValueinfo.LastFloor

を参照することができます。また、プロパティを大文字で始めるようにします。

public class FloorInfo 
{ 
    public Floor LastFloor { get; private set; } 
    public float FloorValue { get; private set; } 

    public FloorInfo(Floor lastF, float val) 
    { 
     lastFloor = lastF; 
     floorValue = val; 
    } 
} 
1

あなたは、公共などの分野lastFlootfloorValueをマーク、またはより良いまだこのように、これらのプライベートフィールドにアクセスするためのパブリックプロパティを提供する必要があります。

public class FloorInfo 
{ 
    private Floor m_lastFloor; 
    private float m_floorValue; 

    public Floor LastFloor { 
      get { return m_lastFloor; } 
    } 

    public float FloorValue { 
      get { return m_floorValue } 
    } 

    public FloorInfo(Floor lastF, float val) 
    { 
     m_lastFloor = lastF; 
     m_floorValue = val; 
    } 
} 

は、その後、あなたがこのような値にアクセスすることができます。

FloorInfo info = new FloorInfo(current, F); 
float value = info.FloorValue; 
+1

Terser(および、もっと読みやすいIMHO)の構築は 'public Floor LastFloor {get;}です。プライベートセット;} ' –