从结构访问字段
Accessing fields from a struct
例如,我有一个名为 MyHouse 的结构。
struct MyHouse
{
int Light;
int Water;
int Food;
public MyHouse(int Light, int Water, int Food)
{
this.Light = Light;
this.Water = Water;
this.Food = Food;
}
}
城市class:
class City
{
private MyHouse house;
public City(MyHouse house)
{
this.house = house;
}
public MyHouse GetHouse()
{
return house;
}
}
例如在 main 中我创建
City c = new City(new MyHouse(3,6,1));
其中 City
是 class
,其中 struct MyHouse
是。如果我想从MyHouse
获取灯号,从City
获取class我该怎么办?
在 MyHouse 中添加一个 属性 以便可以访问私人数据:
private int light;
public int Light{
get { return light; }
}
然后你可以这样写:
int l = c.GetHouse().Light;
当然GetHouse()
可以变成属性
public MyHouse House{
get { return house; }
set {light = house;}
}
属性比方法 "better",因为:
调试时可以很容易地使用它们 - 将鼠标悬停在属性上方并查看值
它们经常被框架(实体框架、图形组件)使用。属性用于列的自动显示
属性比直接访问字段 "better" 因为:
-如果客户端代码用于访问属性,一些代码可以稍后添加到属性 get
或set
无需对客户端进行任何更改
-如果他们是virtual
,他们可以是overriden
in sub 类
你可以这样称呼:
int i = c.GetHouse().Light;
但前提是 Light
是 public
。现在不是,这会阻止您访问该字段。
您可以从您的字段中创建属性。我建议也将 Light
设为 class
:
class MyHouse
{
public int Light {get;set;}
public int Water {get;set;}
public int Food {get;set;}
public MyHouse(int light, int water, int food)
{
this.Light = light;
this.Water = water;
this.Food = food;
}
}
我还希望 City
有一个 House
的列表,而不仅仅是一个。也许你应该让 GetHouse()
变成 List<House> Houses
属性.
如果您没有像 public 那样指定任何 属性、protected 或 private,C# 会将变量设为 "struct" 的私有变量。因此,您需要创建变量 public 以便您可以直接访问它,或者添加一个 public 方法来访问私有变量。
如果在MyHouse
你修改
int Light;
成为
public int Light {get; private set;}
您可以像这样从 City
对象获取光值:
c.GetHouse().Light
解释:
public
将 Light
的可见性从 private
(默认值)更改为 public
。私有 class/struct 成员只能由 class 本身在内部访问。为了使其他 classes 可用,例如 City
在这种情况下,我将其设为 public.
{get; private set;}
将 Light
从一个简单的字段变成了一个 属性,基本上是一个字段,其访问围绕着一个 getter 和一个 setter 方法.在您的示例中,Light
的值仅在 MyHouse
的构造函数中设置,因此我设置了 setter private
。也就是说只有MyHouse
可以改变Light
的值;但是,City
仍然可以得到值。
例如,我有一个名为 MyHouse 的结构。
struct MyHouse
{
int Light;
int Water;
int Food;
public MyHouse(int Light, int Water, int Food)
{
this.Light = Light;
this.Water = Water;
this.Food = Food;
}
}
城市class:
class City
{
private MyHouse house;
public City(MyHouse house)
{
this.house = house;
}
public MyHouse GetHouse()
{
return house;
}
}
例如在 main 中我创建
City c = new City(new MyHouse(3,6,1));
其中 City
是 class
,其中 struct MyHouse
是。如果我想从MyHouse
获取灯号,从City
获取class我该怎么办?
在 MyHouse 中添加一个 属性 以便可以访问私人数据:
private int light;
public int Light{
get { return light; }
}
然后你可以这样写:
int l = c.GetHouse().Light;
当然GetHouse()
可以变成属性
public MyHouse House{
get { return house; }
set {light = house;}
}
属性比方法 "better",因为:
调试时可以很容易地使用它们 - 将鼠标悬停在属性上方并查看值
它们经常被框架(实体框架、图形组件)使用。属性用于列的自动显示
属性比直接访问字段 "better" 因为:
-如果客户端代码用于访问属性,一些代码可以稍后添加到属性 get
或set
无需对客户端进行任何更改
-如果他们是virtual
,他们可以是overriden
in sub 类
你可以这样称呼:
int i = c.GetHouse().Light;
但前提是 Light
是 public
。现在不是,这会阻止您访问该字段。
您可以从您的字段中创建属性。我建议也将 Light
设为 class
:
class MyHouse
{
public int Light {get;set;}
public int Water {get;set;}
public int Food {get;set;}
public MyHouse(int light, int water, int food)
{
this.Light = light;
this.Water = water;
this.Food = food;
}
}
我还希望 City
有一个 House
的列表,而不仅仅是一个。也许你应该让 GetHouse()
变成 List<House> Houses
属性.
如果您没有像 public 那样指定任何 属性、protected 或 private,C# 会将变量设为 "struct" 的私有变量。因此,您需要创建变量 public 以便您可以直接访问它,或者添加一个 public 方法来访问私有变量。
如果在MyHouse
你修改
int Light;
成为
public int Light {get; private set;}
您可以像这样从 City
对象获取光值:
c.GetHouse().Light
解释:
public
将 Light
的可见性从 private
(默认值)更改为 public
。私有 class/struct 成员只能由 class 本身在内部访问。为了使其他 classes 可用,例如 City
在这种情况下,我将其设为 public.
{get; private set;}
将 Light
从一个简单的字段变成了一个 属性,基本上是一个字段,其访问围绕着一个 getter 和一个 setter 方法.在您的示例中,Light
的值仅在 MyHouse
的构造函数中设置,因此我设置了 setter private
。也就是说只有MyHouse
可以改变Light
的值;但是,City
仍然可以得到值。