2016-04-13 65 views
1

所以是的,我覺得這個問題真的很愚蠢,但我目前正在編寫一個簡單的探路者腳本。我想用字典一樣Unity C#詞典中的自定義類

Dictionary<Floor, FloorInfo>

其中地板是地磚我正在引用和FloorInfo是定製類如下:

public class FloorInfo 
{ 
    Floor lastFloor; 
    float floorValue; 

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

但之後,我創造這樣

FloorInfo info = new FloorInfo(current, F); 

我無法獲得數值,如info.valinfo.lastF

你能向我解釋我做錯了什麼?我感到非常尷尬,因爲我被困在這樣的事情上,或者過去了45分鐘。編輯:好的,謝謝大家誰已經回答。似乎最明顯的事情也可能是相當成問題的。再次感謝,祝你有美好的一天!

+1

您尚未指定任何_access修飾符_('private/protected/public'),因此默認情況下這些屬性是'private',即從外部不可訪問 一類。 – Crozin

回答

1

如果您想從課外訪問它們,請將它們公開。

1

這是因爲C#class'字段的訪問修飾符(默認情況下)是private。上述操作嘗試訪問class範圍之外的private字段(這是不允許的)。

要訪問的領域,使其訪問修飾符public,那麼你就可以在class範圍之外訪問它們:

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,因爲它們只是您的構造函數的參數。您訪問您的類的字段,而不是其構造函數的參數。

這就是說,將它們作爲property而不是field訪問它們更爲常見。

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,但目前它們是私人的。你應該讓這些公開。如果你沒有指定修飾符,那麼默認情況下它是私有的,並且在它們被定義的類之外是不可見的。

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

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

所以之後就可以引用info.floorValueinfo.LastFloor

如果你想要好的設計,那麼你應該讓這些成性,並且可能使set私人,使他們不能在FloorInfo類之外被改變。也使屬性以大寫字母開頭。

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(和,恕我直言,更可讀)建設是'公共樓層LastFloor {get;私人設置;}' –