Month: November 2015

Żeby do czegoś dojść …

Posted on

Jeśli chodzi o bycie naprawdę dobrym Developerem (Ninja, Wymiatacz, etc) bez stosowania się do tego treściwego przesłania się nie obędzie.

a to trochę rozszerzona (choć w połowie już nuży) wersja:

Advertisements

Dzielenie z resztą bez rzutowania na float

Posted on Updated on

Aby dzielenie odbyło się z resztą operacja musi się odbyć na typach double a nie na int, czyli żeby wynik nie był zaokrąglony do inta. W praktyce dzielenie na intach:

int result = 4/3; // result == 1
Kiedyś rzutowałem w ten sposób:
int rowsNeeded = (int)Math.Ceiling((double)Sources.Count / 2);
A od dziś dzięki Grzesiowi będę zmieniał drugą liczbę na explicit double:

int rowsNeeded = (int)Math.Ceiling(Sources.Count / 2D);

Null-coalescing (??) operator działa też dla typów nullable

Posted on Updated on

Metoda pobierająca ale też od razu cachująca jakieś dane mogłaby wygladać tak:

private CustomerData _data; // assigned null by default

public CustomerData Data
{
    get
    {
        // Retrieve data that is expensive to get only at first contact
        _data = _data ?? GetValue(); 

        return _data;
    }
}

Korzystamy z operatora ?? który zwróci albo vartość po lewej stronie (gdy jest ona nie nullem) albo wartość po prawej stronie (gdy ta po lewej jest nullem).

Czy typy nullable (double?) też tak można skracać? Kiedyś napisałbym tak:

private double? _value;

public double Value
{
    get
    {
        if (!_value.HasValue)
        {
            _value = CalculateValue();
        }

        return _value.Value;
    }
}

Teraz jednak wiem że operator ?? zadziała też tutaj:

private double? _value;

public double Value
{
    get
    {
        _value = _value ?? CalculateValue();

        return _value.Value;
    }
}

Jak castować na właściwy Enum

Posted on

Napiszę jak to robię bo .NET udostępnia parę fajnych rzeczy do tego.

Głównie chodzi o parsowanie ze stringa.

FileMode fileMode = (FileMode)Enum.Parse(typeof(FileMode), stringValue, true);

Trzeci argument nazywa się ignoreCase i zazwyczaj ustawiam na true czyli wielkość liter nie muszi się zgadzać, żeby zwrócić właściwy enum.

Jeśli może się nie powieść to korzystam z analogicznej funkcji TryParse()

FileMode fileMode;
if (Enum.TryParse(stringValue, true, out fileMode))
{
    return fileMode;
}
else
{
    // ..
}

Najczęściej wrzucam do projektów coś na wzór tych rozkmin z StackOverflow:
http://stackoverflow.com/questions/16100/how-do-i-convert-a-string-to-an-enum-in-c/16104#16104
http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum/79903#79903

public class EnumHelper
{
    public static TEnum GetEnumFromString<TEnum>(string value) where TEnum : struct, IComparable
    {
        if (!typeof(TEnum).IsEnum)
        {
            throw new ArgumentException(string.Format("{0} must be an enumerated type", typeof(TEnum).FullName));
        }

        return (TEnum)Enum.Parse(typeof(TEnum), value, true);
    }
}

Nieużywane argumenty lambd

Posted on

ScrollView.ViewForZoomingInScrollView += x => PageImageView;

Jest tutaj nieużywany argument. Gdyby był potrzebny i wyglądało to np tak:

ScrollView.ViewForZoomingInScrollView += x => PageImageView(x);

to wszystko byłoby w porządku. Jeśli jednak mamy taki nieużywany możemy go sprytnie ominąć korzystając z podkreślenia (podłogi)

ScrollView.ViewForZoomingInScrollView += _ => PageImageView;

Dzięki temu od razu widzimy, że ten argument jest nieistotny i czytając nie musimy się na nim skupiać.