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 "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();
}
}
Getters and setters -- how properties are accessed -- still function like methods in this regard. That is,
is "equivalent" to
The "copy" of the structure (value) is made when it is returned from the getter (or passed to the setter). If
Dist1
were a member variable this would not be the case and would work "as expected".Happy coding.
struct are value types - so when you are accessing
distances.Dist1.SetFeet
you 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]
OTOH if you do
distances.Dist1 = new Distance ().SetFeet (1000);
AND change the return ofSetFeet
fromvoid
toDistance
it should work. Alternatively makeDistance
a class.For a reference on how to build structs in a way that they work as expected see the
DateTime
struct in the framework - http://msdn.microsoft.com/en-us/library/system.datetime.aspx[/EDIT after comment]