Как структура определяется как свойство? - PullRequest
1 голос
/ 13 июля 2009

Название может быть неправильным, если это так, пожалуйста, измените. Я не знаю, как задать свой вопрос, поэтому просто посмотрите на код, так как он должен быть очевидным.

Использование закомментированного кода будет работать, но я хочу знать, почему реальный код не работает. Я уверен, что это неправильно, но как это можно исправить? Или это не так, как это сделано?

using System;

namespace SomethingAwful.TestCases.Structs
{
    public class Program
    {
        public static void Main()
        {
            Foo f = new Foo();
            f.Bar.Baz = 1;

            Console.WriteLine(f.Bar.Baz);
        }
    }

    public class Foo
    {
        public struct FooBar
        {
            private int baz;

            public int Baz
            {
                get
                {
                    return baz;
                }
                set
                {
                    baz = value;
                }
            }

            public FooBar(int baz)
            {
                this.baz = baz;
            }
        }

        private FooBar bar;

        public FooBar Bar
        {
            get
            {
                return bar;
            }
            set
            {
                bar = value;
            }
        }

        //public FooBar Bar;

        public Foo()
        {
            this.bar = new FooBar();
            //this.Bar = new FooBar();
        }
    }
}

Ответы [ 3 ]

9 голосов
/ 13 июля 2009

Структура копируется только по значению, поэтому все, что вам нужно сделать, это изменить возвращенную копию. Используйте класс.

5 голосов
/ 13 июля 2009

Используйте

Foo.FooBar myFooBar = new Foo.FooBar { Baz = 1 };
f.Bar = myFooBar;

Как сказал Стивен, вам нужно создать экземпляр структуры и установить для него свойство. В противном случае оно передается по значению.

1 голос
/ 13 июля 2009

Кроме того, вы можете думать о структуре как о «уже выделенной», так что вам не нужна слишком новая () ее. Вместо

this.Bar = new FooBar();

Просто сделай

this.Bar.Baz = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...