我对编程并不陌生,但我对C#结构的理解似乎有一个漏洞。
任何人都可以解释为什么以下代码打印出“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();
}
}
答案 0 :(得分:5)
struct是值类型 - 因此当您访问distances.Dist1.SetFeet
时,您基本上正在访问副本...例如,请参阅MSDN http://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx
[评论后编辑]
OTOH,如果你distances.Dist1 = new Distance ().SetFeet (1000);
并将SetFeet
的回报从void
更改为Distance
则应该有效。或者将Distance
作为一个类。
有关如何以预期的方式构建结构的参考,请参阅框架中的DateTime
结构 - http://msdn.microsoft.com/en-us/library/system.datetime.aspx
[/评论后编辑]
答案 1 :(得分:4)
Getters和setter - 如何访问属性 - 在这方面仍然像方法一样运行。也就是说,
distances.Dist1.SetFeet(1000);
与
“等效”distances.GetDist1().SetFeet(1000);
结构(值)的“ copy ”是从getter返回(或传递给setter)时生成的。如果Dist1
是成员变量,则情况并非如此,并且可以“按预期”运行。
快乐的编码。
答案 2 :(得分:0)
只需从距离声明中删除COUNT(DISTINCT myID) AS cnt
,代码即可正常工作。
{ get; set; }