Почему разрешено устанавливать свойство, которое ничего не устанавливает в C #? - PullRequest
3 голосов
/ 02 июля 2010

Я просматривал инструментарий PRISM и нашел много примеров, когда они объявляют открытое свойство с пустыми получателями / установщиками, но все же могут устанавливать свойство экземпляра класса. Как / почему это возможно?

    public class ShellPresenter
    {
        public ShellPresenter(IShellView view)
        {
            View = view;

        }

        public IShellView View { get; private set; }
    }

//calling code
ShellPresenter sp = new ShellPresenter();

//Why is this allowed?
    sp.View = someView;

Ответы [ 5 ]

11 голосов
/ 02 июля 2010

Это новая функция в C # 3.0.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

В C # 3.0 и более поздних версиях автоматически реализуемые свойства делают объявление свойства более кратким, когда в средствах доступа к свойствам не требуется дополнительная логика.

8 голосов
/ 02 июля 2010

Они используют свойства C # auto. Это удобство, благодаря которому компилятор создает поле поддержки для вас. private set означает, что свойство доступно только для чтения вне класса. Таким образом, если sp.View = someView; используется вне класса, это приведет к ошибке компиляции.

0 голосов
/ 02 июля 2010

То, что вы опубликовали, не допускается, если объект не устанавливается внутри самого класса. Вот пример кода того, что разрешено и не разрешено.

   public interface IShellView
    {

    }
    public class View:IShellView
    {
    }

    //public class SomeOtherClass
    //{
    //    static void Main()
    //    {
    //        IShellView someView = new View();
    //        //calling code 
    //        ShellPresenter sp = new ShellPresenter();

    //        //Why is this allowed? 
    //        sp.View = someView;//setting a private set outside the ShellPresenter class is NOT allowed.
    //    }
    //}

    public class ShellPresenter
    {
        public ShellPresenter()
        {
        }
        public ShellPresenter(IShellView view)
        {
            View = view;

        }
        static void Main()
        {
            IShellView someView = new View();
            //calling code 
            ShellPresenter sp = new ShellPresenter();

            //Why is this allowed? 
            sp.View = someView;//because now its within the class
        }
        public IShellView View { get; private set; }
    } 
0 голосов
/ 02 июля 2010

Декомпиляция вашего ShellPresenter с помощью Red Gate .NET Reflector

public class ShellPresenter
{
// Fields
[CompilerGenerated]
private IShellView <View>k__BackingField;

// Methods
public ShellPresenter(IShellView view)
{
    this.View = view;
}

// Properties
public IShellView View
{
    [CompilerGenerated]
    get
    {
        return this.<View>k__BackingField;
    }
    [CompilerGenerated]
    private set
    {
        this.<View>k__BackingField = value;
    }
  }
}
0 голосов
/ 02 июля 2010

Компилятор C # создает поле для вас.Этот синтаксис был введен для поддержки анонимных типов (например, new { A = 1, B = "foo" })

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