Вы не правильно понимаете, что такое функция. В C# всё делится на мета-данные и просто данные - экземпляры. К примеру вы берёте два яблока красное и зелёное, и говорите у них есть мета-данные: цвет, вкус, запах. Так же у них есть данные: красный и зелёный, сладкий и кислый, ароматный и парафиновый. При этом данные изменяются в зависимости от того какое яблоко вы взяли, а мета-данные это фишка всех яблок, то есть абстракция.
Функции так же можно разделить на мета и экземпляры. Так вот, экземпляр функции - это состояние когда она выполняется процессором то есть у экземпляров функции могут быть разные аргументы, время выполнения, исполненные блоки, но сам код здесь выступает мета-данными. То есть
public void func( int d ){
int a = d;}
переменная 'a' будет во всех экземплярах, но вот сам d может меняться.
Создание экземпляра функции это сам её вызов то есть когда вы пишите Func(); вы уже создали экземпляр функции и более того выполнили, но удалить её можно лишь изнутри, то есть оператор return. Вы можете создать переменную на экземпляр функции и здесь появляется некая запутанность, экземпляр функции представлен двумя объектами это аргументы+адрес функции и поток выполнения. Первое представлено через делегат, второе через класс thread и на самом деле явно не представлено в C#. У вас всегда есть лишь один поток и каждый вызов функции происходит в одном потоке. Вы можете либо прервать выполнение потока, либо обнулить или вставить пустую функцию используя делегат.
Но всё это такие извращения для ленивых C# кодеров, что куда проще вызывать функцию в зависимости от условия через оператора if.
if (10 < 5) {
Func();
}
то есть нет ни каких поводов удалять функцию(и то не саму функцию а её экземпляр), если можно её просто не вызывать.