所以是的,我觉得这个问题真的很愚蠢,但我现在正在编写一个简单的探路者脚本。我想使用像
这样的字典 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.val
或info.lastF
你能解释一下我做错了什么吗?我感到非常尴尬,我被困在这样的事情或过去45分钟。
编辑:好的,谢谢所有已回复的人。似乎最明显的事情也可能很成问题。再次感谢,祝你有愉快的一天!答案 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; }
,您可以在property
和getter
中设置其他内容(例如检查您的媒体资源的输入是否有效),这是时间,更安全的设计:
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)
lastF
和val
是构造函数的参数。一旦构造函数完成,它们就会消失。
您已将这些值复制到lastFloor和floorValue,但目前它们是私有的。你应该公开这些。如果您未指定修饰符,则默认情况下它是私有的,并且在定义它们的类之外是不可见的。
public class FloorInfo
{
public Floor lastFloor;
public float floorValue;
public FloorInfo(Floor lastF, float val)
{
lastFloor = lastF;
floorValue = val;
}
}
因此您可以引用info.floorValue
和info.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)
您必须将字段lastFloot
和floorValue
标记为公开,或者更好地提供用于访问这些私有字段的公共属性,如下所示:
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;