Все активные действия программ на C# выполняются в методах классов. Естественно, эти методы могут получать на вход параметры и выдавать значения. При передаче параметров в C# необходимо явно указывать способ передачи - по значению или по ссылке; в последнем случае переменной должно предшествовать ключевое слово ref . Кроме того, создатели C# предусмотрели возможность для возвращения более чем одного значения из метода - для этого помимо явного возвращаемого значения метода, необходимо описать один или несколько параметров метода с ключевым словом out. Компилятор C# проверяет, что ref -параметры инициализируются перед вызовом метода, а также, что out-параметры получают значение до выхода из метода.
С точки зрения перегрузки методов, отличительной особенностью C# является то, что методы по умолчанию не являются виртуальными. Это сделано для того, чтобы избежать ошибок, связанных со случайным переопределением унаследованных функций. Кроме того, в C# есть два способа переопределения виртуального метода: при использовании ключевого слова override базовый метод становится недоступным, а при использовании ключевого слова new базовый метод все еще может быть вызван путем явного приведения к типу базового класса, как в следующем примере:
class BaseClass { public void TestMethod() { Console.WriteLine ("BaseClass.TestMethod()"); } } class DerivedClass : BaseClass { new public void TestMethod() { Console.WriteLine ("DerivedClass.TestMethod()"); } } ... DerivedClass test = new DerivedClass(); test.TestMethod(); // напечатает DerivedClass.TestMethod ((BaseClass)test).TestMethod(); // напечатает BaseClass.TestMethod