Spójrzmy na tego kulfona:
if( cloneableMetadataConcatenatorStr == “option1”
|| cloneableMetadataConcatenatorStr == “option2”
|| cloneableMetadataConcatenatorStr == “option3”
|| cloneableMetadataConcatenatorStr == “option4”)
{
}
I porównajmy do tego:
if( cloneableMetadataConcatenatorStr.In(“option1”, “option2”,
if( cloneableMetadataConcatenatorStr == “option1”
|| cloneableMetadataConcatenatorStr == “option2”
|| cloneableMetadataConcatenatorStr == “option3”
|| cloneableMetadataConcatenatorStr == “option4”)
{
}
I porównajmy do tego:
if( cloneableMetadataConcatenatorStr.In(“option1”, “option2”,
“option3”, “option4”)
{
}
Oba fragmenty robią to samo, ale który z nich daje ci więcej natchnienia?
Metoda In() w string niestety nie istnieje, ale możemy ją łatwo dokleić. Wystarczy, że napiszemy klasę zawierającą metodę rozszerzającą string’a:
namespace Helpers
{
public class ExttentionMethods
{
}
Oba fragmenty robią to samo, ale który z nich daje ci więcej natchnienia?
Metoda In() w string niestety nie istnieje, ale możemy ją łatwo dokleić. Wystarczy, że napiszemy klasę zawierającą metodę rozszerzającą string’a:
namespace Helpers
{
public class ExttentionMethods
{
public static In(this string obj, params string[] options)
{
return options.Contains(obj);
}
}
}
Sposobów na wykorzystanie tej funkcjonalności jest bardzo wiele.
Co prawda, nie będziemy chcieli rozszerzać klasy za każdym razem, gdy znajdziemy ku temu okazję, ale w często występujących przypadkach pomoże nam to zaoszczędzić czasu, ilości pisanego kodu oraz doda do kodu przejrzystości i świeżości.
Z pewnością nie ominie nas w aplikacji logowanie błędów, czy walidowanie parametrów metod:
catch (Exception e)
{
ErrorLogger.Log(e);
}
możemy zastąpić:
catch (Exception e)
{
e.Log();
}
oraz:
void SomeMethod(object mustBeNotNull)
{
if (mustBeNotNull == null)
{
{
throw new ArgumetNullException(mustBeNotNull);
}
}
zastępujemy:
void SomeMethod(object mustBeNotNull)
{
mustBeNotNull.ThrowIfNull(“mustBeNotNull”);
}
poprzez napisanie wcześniej paru linijek:
public static ThrowIfNull(this object obj, string objName)
{
zastępujemy:
void SomeMethod(object mustBeNotNull)
{
mustBeNotNull.ThrowIfNull(“mustBeNotNull”);
}
poprzez napisanie wcześniej paru linijek:
public static ThrowIfNull(this object obj, string objName)
{
if( obj == null )
{
throw new ArgumetNullException(objName);
}
}
Użycie metody rozszerzającej tak naprawdę jest tłumaczone przez kompilator na wywołanie metody statycznej, której pierwszym parametrem jest obiekt, na którym wywoływana jest metoda. Z tego powodu, jeśli obiekt będzie null’em to nie zostanie rzucony wyjątek tak jak przy wywołaniu metody instancji.
Kolejne przykłady użycia:
bool isHour = 17.Between(0, 24);
int number = “158”.ToInt();
DataTable dt = “SELECT * FROM WORKERS”.Execute();
Użycie metody rozszerzającej tak naprawdę jest tłumaczone przez kompilator na wywołanie metody statycznej, której pierwszym parametrem jest obiekt, na którym wywoływana jest metoda. Z tego powodu, jeśli obiekt będzie null’em to nie zostanie rzucony wyjątek tak jak przy wywołaniu metody instancji.
Kolejne przykłady użycia:
bool isHour = 17.Between(0, 24);
int number = “158”.ToInt();
DataTable dt = “SELECT * FROM WORKERS”.Execute();