Unity C#字典中的自定义类

时间:2016-04-13 12:35:07

标签: c# dictionary

所以是的,我觉得这个问题真的很愚蠢,但我现在正在编写一个简单的探路者脚本。我想使用像

这样的字典

Dictionary<Floor, FloorInfo>

其中floor是我引用的地板块,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分钟。

编辑:好的,谢谢所有已回复的人。似乎最明显的事情也可能很成问题。再次感谢,祝你有愉快的一天!

4 个答案:

答案 0 :(得分:1)

如果您想从课堂外访问它们,请将它们公开。

答案 1 :(得分:1)

这是因为C#class'field的访问修饰符(默认情况下)是.section { background: url("http://i.imgsafe.org/50f3f94.jpeg") no-repeat center/cover; height: 100%; width: 100%; position: absolute; top: 0; z-index: -1; } 。您在上面执行的操作是尝试访问private范围之外的private字段(不允许)。

要访问这些字段,请设置其访问修饰符class,然后您可以在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; lastF,因为它们只是构造函数的参数。您可以访问类的字段,而不是其构造函数的参数。

话虽如此,以val而不是property访问它们更为常见。

field

这是因为使用public Floor lastFloor { get; set; } public float floorValue { get; set; } ,您可以在propertygetter中设置其他内容(例如检查您的媒体资源的输入是否有效),这是时间,更安全的设计:

setter

但你不能用领域来做这件事。

另外,作为附加说明,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 } } 字段通常会将大写字母作为C#典型命名约定中的第一个字符:

public

答案 2 :(得分: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;
     } 
}

答案 3 :(得分: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;