Как мне использовать get и set в C#?

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

Я не совсем понимаю, как работают геттеры и сеттеры в C#, например, у меня есть этот код для персонажа в игре, который я должен сделать для колледжа:

namespace Clase_25_3_2014
{
    class Brick
    {
        private int speed { get; set; }
        private Vector2 pos { get; set; }
        private Texture2D skin { get; set; }

        public Brick(int speed, Vector2 position, Texture2D skin)
        {
            this.Speed(speed);
            this.Pos(position);
            this.Skin(skin);
        }

    }
}

Теперь, когда я использую класс, я пытаюсь назвать его так:

Brick brick = new Brick(1, Vector2.Zero, mySkin);
brick.GetPos();

Теперь, очевидно, это выглядит странно для вас, ребята, и это потому, что я еще не выяснил, как я должен правильно его использовать, чтобы он работал как brick.getPos(); из Явы.

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

5 ответов

Решение

Вы не можете сделать GetPos, потому что pos является приватным и у вас нет метода под названием "GetPos". Если вы сделаете pos общедоступным, вы можете просто использовать Brick.pos для получения и Brick.pos(position) для установки.

Вот как вы могли бы написать этот класс:

namespace Clase_25_3_2014
{
    class Brick
    {
        public Brick(int speed, Vector2 position, Texture2D skin)
        {
            this.Speed = speed;
            this.Pos = position;
            this.Skin = skin;
        }

        public int Speed { get; set; }
        public Vector2 Pos { get; set; }
        public Texture2D Skin { get; set; }
    }
}

Типы доступа класса:

// lots of explicity (is that a word? :)
public MyClass
{
  // Field
  // It is recommended to never expose these as public
  private int _myField; 

  // Property (old school, non-auto private field)
  public int MyProperty
  {
    public get
    {
      return this._myField;
    }
    public set
    {
      this._myField = value;
    }
  }

  // Property (new school, auto private field)
  // (auto field cannot be accessed in any way)
  public int MyProperty2 { public get; private set; }

  // Method (these are not needed to get/set values for fields/properties.
  public int GetMyMethod()
  {
    return this._myField;
  }
}


var myClass = new MyClass;

// this will not compile,
// access modifier says private
// Set Field value
myClass._myField = 1;  

// Get Property Value
var a = myClass.MyProperty;

// Set Property Value
myClass.MyProperty = 2;

// Get Property Value
var b = myClass.MyProperty2;

// this will not compile
// access modifier says private
// Set Property Value
myClass.MyProperty2 = 3;

// Call method that returns value
var c = myClass.GetMyMethod();

Попробуйте перейти на это:

    public Brick(int speed, Vector2 position, Texture2D skin)
    {
        this.Speed = speed;
        this.Pos = position;
        this.Skin = skin;
    }

А с C# вам не нужны конструкторы этого типа. Вы можете объявить объект этого класса без конструктора следующим образом:

public Brick brickTest(){
   Speed = 10,
   Position = new Vector2(),
   Skin = new Texture2D()
};

Когда вы объявляете авто-свойство в C#, оно будет скрытно скомпилировано в методы get и set, но вам даже не нужно думать об этом. Вы можете получить доступ к свойству, как если бы это было поле.

Преимущество наличия свойства заключается в том, что вы можете легко заменить его на более обычное свойство с помощью вспомогательного поля, чтобы вы могли предоставить собственную логику в методе получения и / или установки. Но пока вам это не нужно, это просто дополнительный шум. Свойство auto предоставляет синтаксический сахар, чтобы избежать этого шума.

Brick brick = new Brick(1, Vector2.Zero, mySkin);
Vector2 oldPos = brick.pos;
brick.pos = new Vector2.One;
namespace Clase_25_3_2014
{
    class Brick
    {
        public int Speed { get; set; }
        public Vector2 Pos { get; set; }
        public Texture2D Skin { get; set; }

        public Brick(int speed, Vector2 position, Texture2D skin)
        {
            this.Speed = speed;
            this.Pos = position;
            this.Skin = skin;
        }

    }
}

Использование снаружи:

Brick brick = new Brick(1, Vector2.Zero, mySkin);
Console.WriteLine(Brick.Pos);

однако, за кулисами компилятор создает для каждого свойства:

  • Хранение приватной переменной типа Property.
  • Две функции (Get\Set).
  • Перевести свойство, используемое для их функций.

Вы должны просто сделать:

Brick brick = new Brick(1, Vector2.Zero, mySkin);
Vector2 vec = brick.pos;
Другие вопросы по тегам