Структура - это тип значения, поэтому, если я назначу структуру другой структуре, ее поля будут скопированы во второй структуре. Но что произойдет, если некоторые поля структуры являются ссылочным типом?
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
Почему IP
(строка, являющаяся ссылочным типом) address1
не изменяется?
Такое же поведение возникает, если я заменяю string
на IPAddress
для представления IP внутри MyIPEndPoint
: хотя IPAddress
является классом (который является ссылочным типом), он не ведет себя как ссылочный тип. Почему?
В самом деле, если я обертываю string
, которые представляют IP, используя новый простой класс MyIP
, поведение изменяется.
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
Я ожидал этот выход в первом случае. Почему в первом случае ссылка не ведет себя так, как ожидалось?