Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字典中的统一C#自定义类_C#_Dictionary - Fatal编程技术网

字典中的统一C#自定义类

字典中的统一C#自定义类,c#,dictionary,C#,Dictionary,所以,是的,我觉得问这个问题很愚蠢,但我目前正在编写一个简单的探路者脚本。我想用字典,比如 字典 其中floor是我引用的地砖,FloorInfo是自定义类,如下所示: public class FloorInfo { Floor lastFloor; float floorValue; public FloorInfo(Floor lastF, float val) { lastFloor = lastF; floo

所以,是的,我觉得问这个问题很愚蠢,但我目前正在编写一个简单的探路者脚本。我想用字典,比如

字典

其中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分钟


编辑:好的,谢谢所有已经回答的人。似乎最明显的事情也会有相当大的问题。再次感谢你,祝你有愉快的一天

如果要从类外访问它们,则将其公开。

如果要从类外访问它们,则将其公开。

这是因为C#class'字段的访问修饰符(默认情况下)是
private
。上面所做的是尝试访问
范围之外的
私有
字段(这是不允许的)

要访问字段,请将其访问修饰符
设置为公共
,然后您可以在
范围之外访问它们:

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
,因为它们只是构造函数的参数。您可以访问类的字段,而不是其构造函数的参数

也就是说,作为
属性
访问它们比作为
字段
访问它们更为常见

public Floor lastFloor { get; set; }
public float floorValue { get; set; }
这是因为使用
属性
,您可以在
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#class'字段的访问修饰符(默认情况下)是
private
。上面所做的是尝试访问
范围之外的
私有
字段(这是不允许的)

要访问字段,请将其访问修饰符
设置为公共
,然后您可以在
范围之外访问它们:

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
,因为它们只是构造函数的参数。您可以访问类的字段,而不是其构造函数的参数

也就是说,作为
属性
访问它们比作为
字段
访问它们更为常见

public Floor lastFloor { get; set; }
public float floorValue { get; set; }
这是因为使用
属性
,您可以在
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
  }
}

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.lastfool

如果您想要好的设计,那么您应该将这些设置为属性,并可能将
设置为私有,以便它们不能在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;
     } 
}

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.lastfool

如果您想要好的设计,那么您应该将这些设置为属性,并可能将
设置为私有,以便它们不能在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;
     } 
}

您必须将字段
lastFloot
floorValue
标记为public,或者最好提供一个公共属性来访问这些私有字段,如下所示:

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;
然后您可以访问如下值:

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;

您必须将字段
lastFloot
floorValue
标记为public,或者最好提供一个公共属性来访问这些私有字段,如下所示:

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;
然后您可以访问如下值:

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;
您没有指定任何访问修饰符(
private/protected/public
),因此默认情况下这些属性是
private
,即从类外部无法访问。您没有指定任何访问修饰符(
private/protected/public
),因此默认情况下这些属性是
private
,也就是说,从类外部无法访问。简洁(and,IMHO更可读)结构是
public Floor lastfool{get;private set;}
Terser(and,IMHO更可读)结构是
public Floor lastfool{get;private set;}