无法修改struct成员

时间:2011-08-27 04:47:54

标签: c# struct

我对编程并不陌生,但我对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();
    }
}

3 个答案:

答案 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; }