Visual Code
2018-07-23 20:39

Niskiej jakości wpis o currying w c#.

        public static Func<T1, Func<T2, R>> Curry<T1, T2, R>(Func<T1, T2, R> func)
        {
            return x => y => func(x, y);
        }

Przykładowa funkcja, która służy do rozwijania funkcji (currying), w tym przypadku dwuparametrowych, czyli rozłożyć funkcje na takie, które przyjmują tylko jeden argument.

public static Func<X, Z> Compose<X, Y, Z>(Func<X, Y> f, Func<Y, Z> g)
        {
            return x => g(f(x));
        }

Potrzebujemy tego gdy np. chcemy zrobić kompozycje z tych funkcji, albo gdy chcemy wykorzystać w kompozycji jakąś domyślna metodę, która przyjmuje więcej niż jeden parametr.
W przypadku gdy powyższa funkcja wejdzie w skład kompozycji to następna dostanie na wejściu kolejną funkcje lub zwróci R jeżeli podamy jeden argument i możemy sobie pisać takie łańcuszki, czyli spinać funkcje, które odpowiadają za jakąś funkcjonalność.
Tworząc nowe funkcje możemy korzystać z istniejących już funkcji i tutaj również wykorzystujemy curring i domknięcia ułatwiając tworzenie kompozycji.

 Func<string, decimal> getAfterTaxCost = Compose(
                normalizeInput,
                parseToDeciamal, 
                calcAfterTax(0.23M),
            );

#csharp #fp

Visual Code
2018-03-20 23:39

W odniesieniu do wpisu użytkownika @Aventus.
Jeśli chcemy automatycznie konwertować modele z C# do TypeScripta, pomocne może się okazać rozszerzenie Typewriter do VS.
W pliku template.tst możemy okreslić w jaki sposób ma konwertować modele. Możemy zmienić m.in. czy chcemy z domyślnym konstruktorem, które klasy będą brane po uwagę np. tylko z kończące się na Model, sposób formatowania kodu, czy konwersja identyfikatorów np. na małe litery. #angular #aspdotnetcore #csharp #dotnet

grzesiek51114

Zauważyłem, że mam jakąś awersję do programowania we wszystkim co ma script w nazwie. Może to już jakaś choroba...

AreQrm

@grzesiek51114: ja mam podobnie, ale tylko do tego co ma w nazwie "Java" ;-)

Visual Code
2018-03-14 23:01

O tym jak korzystać z HttpClient.
HttpClient implementuje IDisposable, czyli domyślnie chcielibyśmy stworzyć jego instancje z wykorzystaniem using, który zadba o to, by po opuszczeniu scope została wykonana metoda Dispose na tym obiekcie.
Problem w tym, że w ten sposób możemy bardzo szybko wyczerpać ilość dostępnych socketów, co może przyczynić się do powstania trudnych w rozpoznaniu bugów.
Samo pozbycie się obiektu httpClient nie zwalnia nam natychmiastowo socketa. Socket w implementacji TCP przejdzie w stan TIME_WAIT, trwający domyślnie 240 sekund, aby odebrać pakiety, które mogłyby jeszcze nie zdążyć dotrzeć.
Klasa HttpClient, mimo że, implementuje IDisposable jest klasą thread safe, która idealnie radzi sobie ze współbieżnymi zadaniami.
Z tego względu zaleca się wykonywanie wiele żądań na jednej instancji HttpClient.
Możesz stworzyć statyczną instancję, albo singleton z DI. #csharp #dotnet #aspdotnetcore

Aventus

Nawiazywalem do tego "Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe." Zrodlo: http://tnij.at/248639

Visual Code
2018-03-12 23:36

CodeRush to narzędzie, które nie tylko pomaga debugować kod, ale posiada dużo przydatnych funkcji przyspieszające pisanie kodu. Więcej Cena 50$ #csharp #visualstudio

tamtamtu

Nie przyspiesza (prace przyspiesza mi odciecie neta :)) - informacje ze szybciej sie programuje bo zna sie jakis skrot czy cos takiego traktuje jak wymyslanie hasel reklamowych na sile. Z obsluga vim'a w VS mi sie po prostu znacznie przyjemniej pracuje. Myszki praktycznie nie ruszam. Nawigacja bajka. Macra sa swietne (choc tu juz sama . mi wystarczyla). Tabulacja tez dziala. No i wiele innych rzeczy z czego pewnie wiekszosci nie znam :)

Afish

O, wreszcie pokazywanie wartości jak w IntelliJ.

Visual Code
2018-02-22 00:44

Wzorzec projektowy Dekorator #bardzozwięźle pozwala dodawać do klasy nowe funkcjonalności w pewien abstrakcyjny sposób dzięki czemu można to robić w trakcie wykonywania program.
Dekorator po prostu opakowuje obiekt, który dekorujemy i udostępnia funkcjonalności, które mogą być uzależnione od dekorowanego obiektu.
Skoro opakowuje to obiekt dekorowany będzie komponentem w dekoratorze, chcemy traktować udekorowany obiekt jak pierwotny dlatego dekorator będzie również dziedziczył po klasie bazowej. Dekorator również może być dekorowany.
Dekoratorów chcemy wiele dlatego stwórzmy interfejs, na którym będziemy mogli tworzyć nowe dekoratory, jednak chcemy narzucić implementacje dekoratora, aby zawsze istniało powiązanie między kolejnymi dekoracjami, dekorator nie zawsze musi implementować wszystkich funkcjonalności dlatego korzystamy z metod wirtualnych, które zapewnią domyślne działanie w przypadku ich braku.
http://rextester.com/QDP29360

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Czekolada czekolada = new Czekolada();
            Czekolada czekoladaMleczna = new MlecznaDecorator(new Czekolada());
            Czekolada czekoldaMlecznaZToffi = new ToffiDecorator(new MlecznaDecorator(new Czekolada()));
 
            Console.WriteLine("Czekolada:");
            Console.WriteLine(" Opis " + czekolada.getDescription() + ", cost: " + czekolada.cost()); 
 
            Console.WriteLine("Czekolada Mleczna:");
            Console.WriteLine(" Opis " + czekoladaMleczna.getDescription() + ", cost: " + czekoladaMleczna.cost()); 
 
            Console.WriteLine("Czekolada Mleczna z Toffi:");
            Console.WriteLine(" Opis " + czekoldaMlecznaZToffi.getDescription() + ", cost: " + czekoldaMlecznaZToffi.cost()); 
 
            Console.WriteLine("\nJeszcze jedna wersja ta może być uważana za poprawniejszą, ale to kwestia tego co robimy.\n");
 
            Czekolada czekolada2 = new Czekolada();
            Czekolada czekoladaMleczna2 = new MlecznaDecorator2(new Czekolada());
            Czekolada czekoldaMlecznaZToffi2 = new ToffiDecorator2(new MlecznaDecorator2(new Czekolada()));
 
            Console.WriteLine("Czekolada:");
            Console.WriteLine(" Opis " + czekolada2.getDescription() + ", cost: " + czekolada2.cost()); 
 
            Console.WriteLine("Czekolada Mleczna:");
            Console.WriteLine(" Opis " + czekoladaMleczna2.getDescription() + ", cost: " + czekoladaMleczna2.cost()); 
 
            Console.WriteLine("Czekolada Mleczna z Toffi:");
            Console.WriteLine(" Opis " + czekoldaMlecznaZToffi2.getDescription() + ", cost: " + czekoldaMlecznaZToffi2.cost()); 
        }
        }
    }
 
public class Czekolada
{
    virtual public string getDescription(){
        return "Czekolada";
    }
 
    virtual public decimal cost(){
        return 5.0m;
    }
 
}
 
public abstract class CzekoladaDecorator : Czekolada
{
    public abstract string description {get;}
    public abstract decimal thisCost {get;}
 
    protected Czekolada czekolada;
    public CzekoladaDecorator( Czekolada _czekolada) { czekolada = _czekolada;}
 
    override public string getDescription(){
        return this.czekolada.getDescription() + " " + description;
    } 
    override public decimal cost(){
        return this.czekolada.cost() + thisCost;
    }
}
 
public class MlecznaDecorator : CzekoladaDecorator
{
    public MlecznaDecorator(Czekolada _czekolada) : base( _czekolada) {}
 
    override public string description  {get {return "Mleczna";}}
 
    override public decimal thisCost { get {return 2.0m; }}
 
}
 
public class ToffiDecorator : CzekoladaDecorator
{
    public ToffiDecorator(Czekolada _czekolada) : base( _czekolada)
    {
    }
 
    override public string description  {  get {return "Toffi";}}
    override public decimal thisCost {  get {return 3.0m;}}
}
 
// zwykła implementacja
 
public abstract class CzekoladaDecorator2 : Czekolada
{
    protected Czekolada czekolada;
    public CzekoladaDecorator2( Czekolada _czekolada) { czekolada = _czekolada;}
 
    override public string getDescription(){
        return this.czekolada.getDescription();
    } 
    override public decimal cost(){
        return this.czekolada.cost();
    }
}
 
public class MlecznaDecorator2 : CzekoladaDecorator2
{
    public MlecznaDecorator2(Czekolada _czekolada) : base( _czekolada) {}
 
    override public string getDescription(){
        return this.czekolada.getDescription() + " Mleczna";
    } 
    override public decimal cost(){
        return this.czekolada.cost() + 2.0m;
    }
 
}
 
public class ToffiDecorator2 : CzekoladaDecorator2
{
    public ToffiDecorator2(Czekolada _czekolada) : base( _czekolada) {}
 
    override public string getDescription(){
        return this.czekolada.getDescription() + " Toffi";
    } 
    override public decimal cost(){
        return this.czekolada.cost() + 3.0m;
    }
}

#csharp #wzorceprojektowe Jeśli coś się nie zgadza dajcie grzecznie znać by moglibyśmy dojść do wspólnego konsensusu. ;)

Visual Code
2018-02-01 12:55

C# to Javascript compiler. Zobaczcie sami jak wygląda poniższy kod w JavaScripcie ;)

using System;
using System.Threading.Tasks;
using System.Collections.Generic;
public class Program
{
    static Dictionary<int,string> dict = new Dictionary<int,string>();

    public async static void Main()
    {
        var msg = "Hello, 4P!";

        Console.WriteLine(msg);

        for(var i = 0; i < 5; i++){
            dict.Add(i, DateTime.UtcNow.ToString("ss.fff"));
            await Task.Delay(100);
        }

        foreach(var str in dict){
            Console.WriteLine($"4P {str.Key} : {str.Value}");
        }
    }   
}

#csharp #javascript

Azarien

JavaScript must die.

no_solution_found

ale takie kompilatory często robią sieczkę.... ktoś kto ogarnia JSa napisałby to dużo czytelniej