Вы не можете X
свойство Form.Location
, потому что Form.Location
это свойство, которое возвращает тип значения (Point
). Как только вы получите доступ к Form.Location
, вы получите копию местоположения; таким образом, что-то менять в этой копии не имеет смысла. Поскольку this.Location.X = ...
является очевидной ошибкой, компилятор C # не позволяет вам сделать это.
Вы можете, однако, заменить полное значение Form.Location
, так как его установщик свойства равен public
:
private void button1_Click(object sender, EventArgs e)
{
// move window to the left edge of the screen
this.Location = new Point(0, this.Location.Y);
}
или, альтернативно,
private void button1_Click(object sender, EventArgs e)
{
// move window to the left edge of the screen
var loc = this.Location;
loc.X = 0; // yes, it's a mutable struct
this.Location = loc;
}
Возвращаясь к исходному вопросу: если вы хотите сделать объект доступным, но не хотите, чтобы он был изменен, вам нужно будет инкапсулировать его самостоятельно. Например, если вы хотите, чтобы потребители вашего класса могли Draw
на вашем Graphics
объекте, но не хотели, чтобы они вызывали Dispose
, вы просто не можете напрямую выставить объект Graphics
. Вместо этого вам нужно обернуть каждый метод, который может вызывать потребитель:
// bad, consumer can do anything with the Graphics object
public Graphics Graphics
{
get { return graphics; }
}
// good, consumer can only do specific stuff
public void Draw(...)
{
graphics.Draw(...);
}