关于属性的问题,大家快来看看。

兵工厂三剑客 2016-09-10 01:59:55
今天发现了一个问题。不知道是什么原因,很奇怪。先上代码。

//以下是在某个.cs文件中的部分代码:



/// <summary>
/// 端口状态up/down
/// </summary>
public enum PortStatus
{
down,
up
}
/// <summary>
/// 端口是否正常(不良)
/// </summary>
public enum PortNormal
{
不良,
正常
}
/// <summary>
/// 端口
/// </summary>
public class Port
{
/// <summary>
/// 端口号2或4
/// </summary>
public int PortNumber
{
get;
set;
}
/// <summary>
/// 端口状态up or down
/// </summary>
public PortStatus Status
{
get;
set;
}
/// <summary>
/// 端口好坏
/// </summary>
public PortNormal Normal
{
get;
set;
}
}
/// <summary>
/// 端口网口测试
/// </summary>
public class CPEPortPing
{
private static Port port2;
private static Port port4;

public CPEPortPing(Port _port2,Port _port4)
{
port2 = _port2;
port4 = _port4;
}
/// <summary>
/// MAC地址
/// </summary>
public string MACAddress
{
get;
set;
}
/// <summary>
/// SSID
/// </summary>
public string SSID
{
get;
set;
}
/// <summary>
/// 2号网口属性
/// </summary>
public Port Port2
{
get { return port2; }
set { port2 = value; }
}
/// <summary>
/// 4号网口属性
/// </summary>
public Port Port4
{
get { return port4; }
set { port4 = value; }
}
}



然后我在使用到上面的代码的时候,因为在具体程序中老是实现不了我预想的目的,我便写了个小例子,以下是小例子的代码:


private void barButtonItem8_ItemClick(object sender, ItemClickEventArgs e)
{
Port p1 = new Port();
Port p2 = new Port();
Port p3 = new Port();
Port p4 = new Port();
CPEPortPing CPE1 = new CPEPortPing(p1,p2);
CPEPortPing CPE2 = new CPEPortPing(p3,p4);
CPE2.Port2.Status = PortStatus.down;
CPE1.Port2.Status = PortStatus.up;
MessageBox.Show(CPE2.Port2.Status.ToString());//A处
}

private void barButtonItem13_ItemClick(object sender, ItemClickEventArgs e)
{
Port p1 = new Port();
Port p2 = new Port();
p1.Status = PortStatus.down;
p2.Status = PortStatus.up;
MessageBox.Show(p1.Status.ToString() + "," + p2.Status.ToString());//B处
}



为什么A处的输出是“up”,而B处的输出是“down,up”呢。今天才发现的这个问题,一直搞不明白。
...全文
315 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
兵工厂三剑客 2016-09-12
  • 打赏
  • 举报
回复
引用 14 楼 F_Ten 的回复:
static 用在类里的属性、方法前面,这样的静态属性与方法不需要创建实例就能访问,通过类名或对象名都能访问它. 静态属性、方法只有“一份”:即如果一个类新建有N个对象,这N 个对象只有同一个静态属性与方法. 所以同楼上说的,你自己赋值2次,第二次赋的就是up。
懂了,你和楼上的解答解决了我的疑惑。谢谢。
兵工厂三剑客 2016-09-12
  • 打赏
  • 举报
回复
引用 13 楼 hiose89 的回复:
[quote=引用 11 楼 SCGH_Fx 的回复:] [quote=引用 9 楼 xuzuning 的回复:] static 在各实例间都一样
字面意思能理解,但是深层的原理我还是理解不了。[/quote] 你是static 所以是全局的。 static修饰的东西 不属于对象, CPEPortPing CPE1 = new CPEPortPing(p1,p2); CPEPortPing CPE2 = new CPEPortPing(p3,p4); 你的这句话都是在给全局变量 CPEPortPing.Port2 和CPEPortPing.Port4赋值 Port2 Port4 分别让负了两次。 你用对像点出来是骗了你眼睛 他们都是同一个类 正规应是CPEPortPing点出来 CPE2.Port2.Status = PortStatus.down; CPE1.Port2.Status = PortStatus.up; 这两句也是在给同一个东西给值 可以理解成 CPEPortPing.Port2=PortStatus.down; CPEPortPing.Port2= PortStatus.up; 所以这时候你再输出 就是最后一次给的值 那为什么 把static 去掉就有用了呢 因为没有static 他就属于对像。 同一个类NEW了两个不同的对像 所以他们不同,所以各有各的值 。 你的代码本来设计的就有问题,既然要做static 就直接可以类名点来来直接付值 何必再通过构造函数给呢。[/quote] 原来是这样,也就是说如果用static修饰了,那么所有的对象在相关属性(即CPEPortPing.Port2与CPEPortPing.Port4)当中都是共用一个Port实例了。
F_Ten 2016-09-12
  • 打赏
  • 举报
回复
static 用在类里的属性、方法前面,这样的静态属性与方法不需要创建实例就能访问,通过类名或对象名都能访问它. 静态属性、方法只有“一份”:即如果一个类新建有N个对象,这N 个对象只有同一个静态属性与方法. 所以同楼上说的,你自己赋值2次,第二次赋的就是up。
hiose89 2016-09-11
  • 打赏
  • 举报
回复
引用 11 楼 SCGH_Fx 的回复:
[quote=引用 9 楼 xuzuning 的回复:] static 在各实例间都一样
字面意思能理解,但是深层的原理我还是理解不了。[/quote] 你是static 所以是全局的。 static修饰的东西 不属于对象, CPEPortPing CPE1 = new CPEPortPing(p1,p2); CPEPortPing CPE2 = new CPEPortPing(p3,p4); 你的这句话都是在给全局变量 CPEPortPing.Port2 和CPEPortPing.Port4赋值 Port2 Port4 分别让负了两次。 你用对像点出来是骗了你眼睛 他们都是同一个类 正规应是CPEPortPing点出来 CPE2.Port2.Status = PortStatus.down; CPE1.Port2.Status = PortStatus.up; 这两句也是在给同一个东西给值 可以理解成 CPEPortPing.Port2=PortStatus.down; CPEPortPing.Port2= PortStatus.up; 所以这时候你再输出 就是最后一次给的值 那为什么 把static 去掉就有用了呢 因为没有static 他就属于对像。 同一个类NEW了两个不同的对像 所以他们不同,所以各有各的值 。 你的代码本来设计的就有问题,既然要做static 就直接可以类名点来来直接付值 何必再通过构造函数给呢。
兵工厂三剑客 2016-09-11
  • 打赏
  • 举报
回复
引用 10 楼 hiose89 的回复:
[quote=引用 7 楼 SCGH_Fx 的回复:] [quote=引用 4 楼 xuzuning 的回复:] p1.Status = PortStatus.down; p2.Status = PortStatus.up; MessageBox.Show(p1.Status.ToString() + "," + p2.Status.ToString());//B处 不是你自己指定的吗?
B处的输出是我预想中的输出,A处的输出在类的实现中把static去掉后,它输出的是down,不去掉static输出的是up。 我就是搞不懂为什么static会有这个影响。[/quote] CPE2.Port2.Status = PortStatus.down; CPE1.Port2.Status = PortStatus.up; 你把这两个换个顺序 他一定输出是down 你这两个对象地址应该是一样的。 [/quote] 如果换了顺序,那么CPE1.Port2.Status 就是输出的down了。
兵工厂三剑客 2016-09-11
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
static 在各实例间都一样
字面意思能理解,但是深层的原理我还是理解不了。
hiose89 2016-09-11
  • 打赏
  • 举报
回复
引用 7 楼 SCGH_Fx 的回复:
[quote=引用 4 楼 xuzuning 的回复:] p1.Status = PortStatus.down; p2.Status = PortStatus.up; MessageBox.Show(p1.Status.ToString() + "," + p2.Status.ToString());//B处 不是你自己指定的吗?
B处的输出是我预想中的输出,A处的输出在类的实现中把static去掉后,它输出的是down,不去掉static输出的是up。 我就是搞不懂为什么static会有这个影响。[/quote] CPE2.Port2.Status = PortStatus.down; CPE1.Port2.Status = PortStatus.up; 你把这两个换个顺序 他一定输出是down 你这两个对象地址应该是一样的。
xuzuning 2016-09-11
  • 打赏
  • 举报
回复
static 在各实例间都一样
兵工厂三剑客 2016-09-11
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
你设置2、3个断点调试一下就能明白了。基于对象的程序,千万不能滥用 static。
是的,跟static有关系,但是我搞不明白是为什么。
兵工厂三剑客 2016-09-11
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
p1.Status = PortStatus.down; p2.Status = PortStatus.up; MessageBox.Show(p1.Status.ToString() + "," + p2.Status.ToString());//B处 不是你自己指定的吗?
B处的输出是我预想中的输出,A处的输出在类的实现中把static去掉后,它输出的是down,不去掉static输出的是up。 我就是搞不懂为什么static会有这个影响。
兵工厂三剑客 2016-09-11
  • 打赏
  • 举报
回复
引用 3 楼 shayu_470205327 的回复:
static是全局的 CPE2.Port2.Status = PortStatus.down; CPE1.Port2.Status = PortStatus.up; 你这里虽然是初始化的两个对象(CPE1,CPE2),但是都是访问的一个全局变量Port2,所以会以最后一个赋值为准
我搞不明白为什么我把static去掉后,A处的输出就是down了呢。
  • 打赏
  • 举报
回复
他的 down、up 输出乱了。
xuzuning 2016-09-10
  • 打赏
  • 举报
回复
p1.Status = PortStatus.down; p2.Status = PortStatus.up; MessageBox.Show(p1.Status.ToString() + "," + p2.Status.ToString());//B处 不是你自己指定的吗?
shayu_470205327 2016-09-10
  • 打赏
  • 举报
回复
static是全局的 CPE2.Port2.Status = PortStatus.down; CPE1.Port2.Status = PortStatus.up; 你这里虽然是初始化的两个对象(CPE1,CPE2),但是都是访问的一个全局变量Port2,所以会以最后一个赋值为准
  • 打赏
  • 举报
回复
你设置2、3个断点调试一下就能明白了。基于对象的程序,千万不能滥用 static。
兵工厂三剑客 2016-09-10
  • 打赏
  • 举报
回复
我发现了原因,把CPEPortPing类中的static去掉,A出输出的就是down,不去掉输出的就是up。 但是我没搞明白是为什么。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧