Разница между Java и C# в объявлении и инициализации переменных

#java #c# #static #initialization #declaration

Вопрос:

Обычно в java вы можете объявить переменную экземпляра, а затем инициализировать ее внутри конструктора или внутри метода.

Но когда я попытался это сделать, C# он выдал мне ошибку, в которой говорилось, что это должна быть статическая переменная.

На этом изображении я объявил переменную экземпляра объекта MailMerger, а затем инициализировал ее внутри конструктора. Но когда я попытался использовать экземпляр, он выдал мне ошибку с просьбой, чтобы это было static так .

Изображение

Кто-нибудь может, пожалуйста, объяснить мне причину этого, пожалуйста? Заранее спасибо.

Комментарии:

1. ФУ, это привело бы к той же ошибке в Java!

Ответ №1:

Вы вызываете нестатический элемент из статического метода, который не разрешен, как говорится в ошибке.. Вы можете исправить это MailMerger , также сделав статику

 Class Program
{
    static MailMerger merge;

    //rest of your code
}
 

Другим вариантом является создание экземпляра MailMerger внутри статического метода.

Комментарии:

1. Спасибо за разъяснение, я просто был сбит с толку, потому что в java я использовал экземпляр только в статическом методе none, но я никогда этого не понимал, так что фактической разницы между java и C#нет,оба выдадут ошибку, я просто недостаточно информирован, Спасибо за разъяснение еще раз.

Ответ №2:

Причина Main в том, что метод статичен, пока merge переменная находится в области видимости экземпляра.

Вы должны изменить конструктор на статический, а также переменную.

Комментарии:

1. Я знаю, как это исправить, мне просто было интересно, как это работает на java, но вы заставили меня понять, что это работает только в статических методах, даже в java, так что фактической разницы нет, я просто запутался. Спасибо за разъяснение.

Ответ №3:

Вы указали MailMerger Program конструктор in, но вам нужно создать экземпляр метода Program in Main . В вашем Main методе вы вызываете merge метод, который никогда не был инициализирован. Если вы создадите новый экземпляр Program класса, как это:

 Program p = new();
 

Чем вы можете назвать merge поле:

 p.merge.Merge();