Невозможно изменить членов структуры - PullRequest
6 голосов
/ 27 августа 2011

Я совсем не новичок в программировании, но, похоже, в моем понимании структур 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 ]

5 голосов
/ 27 августа 2011

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
[/ EDIT после комментария]

4 голосов
/ 27 августа 2011

Получатели и установщики - как получить доступ к свойствам - все еще работают как методы в этом отношении.Таким образом,

distances.Dist1.SetFeet(1000);

"эквивалентно"

distances.GetDist1().SetFeet(1000);

" копия " структуры (значения) создается при ее возврате изгеттер (или переданный сеттеру).Если бы Dist1 была переменной-членом , это не имело бы место и работало бы "как ожидалось".

Счастливое кодирование.

0 голосов
/ 05 июня 2019

Просто удалите { get; set; } из вашей декларации расстояния, и код работает нормально.

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;//here
    public Distance Dist2;//and here
}

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...