C# 9.0 – Specification – Partial Methods
Índice general – C# 9.0 – Specification
Introducción
Los Partial Methods como tal no es nada nuevo para cualquier programador de C#.
Sin embargo, en C# 9 han sufrido algunas mejoras que conviene destacar. Reconozco que no soy muy amigo de los partial methods, más bien no me gustan nada y trato de evitarlos, ya que no me parece una buena práctica su uso.
No obstante, me veo en la obligación de comentarlos aunque sea de forma general.
Antes de C# 9 y en C# 9
Veamos cómo podemos hacer uso de métodos parciales dentro de C# antes de la nueva especificación.
Imaginemos el siguiente ejemplo de código:
using System; namespace MyNamespace { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); var person = new Person("John"); Console.WriteLine($"{person.GetNameToLower()} - {person.GetNameToUpper()}"); } } partial class Person : IPerson { public string GetNameToLower() => Name.ToLower(); } partial class Person : IPerson { public string Name { get; } public Person(string name) { Name = name; } public string GetNameToUpper() => Name.ToUpper(); } public interface IPerson { string GetNameToUpper(); } }
Aquí he declarado una interfaz IPerson con un método GetNameToUpper.
Y también tenemos dos clases parciales Person y que una de las clases parciales, implementa la interfaz IPerson.
Nuestra clase Person tendrá dos métodos llamados GetNameToUpper y GetNameToLower.
Ahora bien, supongamos que modificamos parte de nuestro código, concretamente las clases parciales de esta forma:
partial class Person : IPerson { public string GetNameToLower() => Name.ToLower(); public partial string GetNameToUpper(); } partial class Person : IPerson { public string Name { get; } public Person(string name) { Name = name; } public partial string GetNameToUpper() => Name.ToUpper(); }
Como podemos observar, en ambas clases implementamos la interfaz, e indicamos que el método GetNameToUpper es parcial.
Pues bien, esto en anteriores especificaciones del lenguaje C# no era válido, y obteníamos un error.
De hecho, los método parciales deben tener un void o return, ni pueden tener ninguna palabra clave de accesibilidad (private, public, etc), ni tampoco parámetros out.
Todas estas restricciones, han sido eliminadas en C# 9, por lo que el código que anteriormente indicaba y que da problemas en C# 8 ó anteriores, en C# 9 es completamente posible.
Nuestro código válido en C# 9 quedaría (por ejemplo) de esta manera:
using System; var person = new Person("John"); Console.WriteLine($"{person.GetNameToLower()} - {person.GetNameToUpper()}"); partial class Person : IPerson { public string GetNameToLower() => Name.ToLower(); public partial string GetNameToUpper(); } partial class Person : IPerson { public string Name { get; } public Person(string name) { Name = name; } public partial string GetNameToUpper() => Name.ToUpper(); } public interface IPerson { string GetNameToUpper(); }
Lo que un método parcial NO puede tener, es múltiple implementaciones, es decir, en el ejemplo anterior, que GetNameToUpper tenga funcionalidad en las dos clases parciales.
Happy Coding!