I’m not at all new to programming, but there seems to be a hole in my understanding of C# structs.
Can anyone explain why the following code prints out the following?
Dist1: 0, Dist2: 0
struct Distance
{
public void SetFeet(int feet) { Value = feet; }
public void SetMiles(float miles) { Value = (int)(miles * 5280f); }
public int GetFeet() { return Value; }
public float GetMiles() { return Value / 5280f; }
private int Value;
}
class Distances
{
public Distance Dist1 { get; set; }
public Distance Dist2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
Distances distances = new Distances();
distances.Dist1.SetFeet(1000);
distances.Dist2.SetFeet(2000);
Console.WriteLine("Dist1: {0}, Dist2: {1}",
distances.Dist1.GetMiles(),
distances.Dist2.GetMiles());
Console.ReadLine();
}
}
struct are value types – so when you are accessing
distances.Dist1.SetFeetyou basically are accessing a copy… see for example at MSDN http://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx[EDIT after comment]
On the other hand, if you do
distances.Dist1 = new Distance ().SetFeet (1000);AND change the return ofSetFeetfromvoidtoDistanceit should work. Alternatively makeDistancea class.For a reference on how to build structs in a way that they work as expected see the
DateTimestruct in the framework – http://msdn.microsoft.com/en-us/library/system.datetime.aspx[/EDIT after comment]