Флориан прав;Еще несколько подробностей, пока мы находимся по теме:
Когда мы вызываем метод для объекта, тогда ссылка на объект передается неявно методу.
Правильно.Один из способов думать об этом заключается в том, что вызов метода типа:
class C
{
int y;
public void M(int x)
{
Console.WriteLine(x + y);
}
}
...
C c = new C();
c.M(10);
фактически совпадает с
class C
{
int y;
public static void M(C _this, int x)
{
Console.WriteLine(x + _this.y);
}
}
...
C c = new C();
C.M(c, 10);
То есть каждый экземпляр метода имеет скрытый параметр "this",и метод «действительно» статический.
Итак, мой вопрос: что происходит, когда метод вызывается в структуре?Это похоже на классы в этом аспекте?
Да.Вместо ссылки на экземпляр передается псевдоним переменной, содержащей структуру.Вот как методы struct могут изменять структуру.(Конечно, изменение структуры - плохая практика, но иногда необходимо.)
struct S
{
int y;
public void M(int x)
{
Console.WriteLine(x + y);
}
}
...
S s = new S();
s.M(10);
логически совпадает с
struct S
{
int y;
public static void M(ref S _this, int x)
{
Console.WriteLine(x + _this.y);
}
}
...
S s = new S();
S.M(ref s, 10);
. Тогда возникает интересный вопрос: что, еслиполучатель "не является переменной?(*) Вы можете использовать только ссылку на переменную.Предположим, у вас есть:
GetAnS().M(10);
???Что будет потом?
Мы создадим переменную для вас.Это становится
S temporary = GetAnS();
temporary.M(10);
, и теперь получатель является переменной, поэтому мы можем сделать «скрытый этот параметр» псевдонимом для него.
(*) Здесь есть и другие интересные случаи:ну, например, что если структура изменяемая, но переменная доступна только для чтения и т. д.