【发布时间】:2012-02-08 23:59:49
【问题描述】:
一个结构是一个值类型,所以如果我将一个结构分配给另一个结构,它的字段将被复制到第二个结构中。但是,如果结构的某些字段是引用类型会发生什么?
public struct MyIPEndPoint
{
public String IP;
public UInt16 Port;
public MyIPEndPoint(String ipAddress, UInt16 portNumber)
{
IP = ipAddress;
Port = portNumber;
}
public override string ToString()
{
return IP+":"+Port;
}
}
...
static int Main(string[] args)
{
MyIPEndPoint address1 = new MyIPEndPoint("127.0.0.1", 8080);
MyIPEndPoint address2 = address1;
address2.IP = "255.255.255.255";
address2.Port = 9090;
Console.WriteLine(address1);
Console.WriteLine(address2);
}
输出是:
127.0.0.1:8080
255.255.255.255:9090
为什么address1 的IP(字符串,即引用类型)不会改变?
如果我将string 替换为IPAddress 以表示MyIPEndPoint 中的IP,则会发生相同的行为:尽管IPAddress 是一个类(即引用类型),但它不会作为引用类型。为什么?
确实,如果我使用新的简单类 MyIP 包装代表 IP 的 string,则行为会发生变化。
public class MyIP
{
public string IpAsString;
public MyIP(string s)
{
IpAsString = s;
}
public override string ToString()
{
return IpAsString;
}
}
当然你也应该通过以下方式调整MyIPEndPoint结构:
public struct MyIPEndPoint
{
public MyIP IP; // modification
public UInt16 Port;
public MyIPEndPoint(String ipAddress, UInt16 portNumber)
{
IP = new MyIP(ipAddress); // modification
Port = portNumber;
}
public override string ToString()
{
return IP+":"+Port;
}
}
最后在Main我只改了一句:
MyIPEndPoint address1 = new MyIPEndPoint("127.0.0.1", 8080);
MyIPEndPoint address2 = address1;
address2.IP.IpAsString = "255.255.255.255"; // modification
address2.Port = 9090;
Console.WriteLine(address1);
Console.WriteLine(address2);
现在的输出是:
255.255.255.255:8080
255.255.255.255:9090
我在第一种情况下期待这个输出。 为什么在第一种情况下,引用的行为不符合预期?
【问题讨论】: