Современный C# — это мультипарадигменный язык, который поддерживает различные подходы к разработке помимо классического объектно-ориентированного программирования.
C# постепенно заимствует многие концепции из функциональных языков.
Func<int, int, int> add = (x, y) => x + y;
var evens = numbers.Where(n => n % 2 == 0)
.Select(n => n * 2);
public record Person(string Name, int Age);
var result = obj switch {
int i when i > 0 => "Positive",
string s => $"String: {s}",
_ => "Unknown"
};
Позволяет вынести сквозную функциональность (cross-cutting concerns) в отдельные модули.
[Log]
public class MyService
{
[Cache]
public string GetData() { ... }
}
services.AddTransient<IService, Service>()
.AddInterceptors<LoggingInterceptor>();
Работа с асинхронными потоками данных.
IObservable<int> source = Observable.Range(1, 10);
source.Where(x => x % 2 == 0)
.Subscribe(x => Console.WriteLine(x));
var channel = Channel.CreateUnbounded<int>();
await channel.Writer.WriteAsync(42);
var item = await channel.Reader.ReadAsync();
// WPF компонент
public class MyComponent : Control { ... }
Хотя C# ООП-язык, процедурный стиль возможен:
public static void ProcessData()
{
var data = ReadData();
var processed = Transform(data);
Save(processed);
}
var method = new DynamicMethod("MyMethod", ...);
var il = method.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", ...));
Оптимизация под современные процессоры:
struct Particle { Vector3 Position; float Size; }
Particle[] particles = new Particle[1000];
public event EventHandler<MyArgs> OnProcessed;
await mediator.Send(new MyCommand());
[Obsolete("Use NewMethod instead")]
public void OldMethod() { ... }
<Button Content="Click" Command="{Binding MyCommand}" />
public class Repository<T> where T : IEntity
{
public T GetById(int id) { ... }
}
современный C# поддерживает множество парадигм — от функционального и реактивного программирования до аспектно-ориентированного подхода и data-oriented design. Грамотное комбинирование этих подходов позволяет писать более выразительный, поддерживаемый и производительный код, адаптируя стиль программирования под конкретную задачу.