A struct is a value type, so if I assign a struct to another struct, its fields will be copied in the second struct. But, what happens if some fields of the struct are a reference type?
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);
}
The output is:
127.0.0.1:8080
255.255.255.255:9090
Why the IP (a string, that is a reference type) of address1 does not change?
The same behavior occurs if I replace string with IPAddress to represent the IP within MyIPEndPoint: although IPAddress is a class (that is a reference type), it does not behave as a reference type. Why?
Indeed, if I wrap the string which represent the IP using a new simple class MyIP, the behavior changes.
public class MyIP
{
    public string IpAsString;
    public MyIP(string s)
    {
        IpAsString = s;
    }
    public override string ToString()
    {
        return IpAsString;
    }
}
Of course you should also adjust the MyIPEndPoint struct in the following way:
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;
    }
}
Finally in the Main I changed only a statement:
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);
Now the output is:
255.255.255.255:8080
255.255.255.255:9090
I was expecting this output in the first case. Why in the first case does the reference not behave as expected?
 
     
     
    