Как мне использовать 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;