Вам либо нужно сделать статический метод MyMethod
:
public static MyMethod(ref AbsClass a)
{
a.Id = "new";
}
Или, желательно, создать экземпляр класса Program
и вызвать MyMethod
из этого экземпляра:
Program p = new Program();
p.MyMethod(ref abs);
Причина, по которой первый метод работает, заключается в том, что метод Main
помечен как статический и не привязан к экземпляру класса Program
. .NET Framework CLR ищет в вашей сборке статический метод с именем Main
, который принимает массив String
, и делает эту функцию точкой входа. Вы заметите, что многие учебники и даже примеры кода MSDN помечают класс Program
ключевым словом static, что считается наилучшей практикой, когда все методы в классе содержат только статические методы.
Причина, по которой работает второй метод и почему он предпочтителен, заключается в том, что вы определили MyMethod
как метод экземпляра . По сути, вам нужен экземпляр объекта, чтобы выполнить метод экземпляра; Ключевое слово new
создает экземпляр указанного типа. Статические методы можно вызывать без экземпляра объекта, но они также не могут получить доступ к каким-либо нестатическим элементам экземпляра (свойствам, частным / общедоступным переменным и т. Д.). Как правило, вы хотите избегать статических методов и классов, если вы не должны реализовывать служебный класс, использовать методы расширения или предоставлять вспомогательные методы.