Struktura jako Result Type

Odpowiedz Nowy wątek
2019-01-05 19:25
Bambaryła
0

Dlaczego wszyscy używają klasy zamiast struktury w takie sytuacji.

      public struct ResultType<T>                                                                                                                                              
      {
            public ResultType(T val)
            {
                Value = val;
            }

            public T Value { get; }

            public bool HasValue()
            {                        
                return Value != null;
            }
        }

Gdzie struktura ma przechowywać wyłącznie jedną referencje ewentualnie wartość, na stosie i 'boola'.

Nie potrzebuję odpowiedzi, która nic nie objaśnia w stylu. "Bo zawsze powinieneś używać klasy, struktura jest tylko do wyjątkowych sytuacji".

Pozostało 580 znaków

2019-01-05 21:12
1

Na przykład dlatego, że struktura ma zawsze bezparametrowy konstruktor i domyślne wartości. Może to doprowadzić do kwiatków.

public struct Hehe
{

}

class Program
{
     static void Main(string[] args)
     {
          ResultType<bool> a = new ResultType<bool>();
          ResultType<bool> b = new ResultType<bool>(false);

          var aHasValue = a.HasValue(); 
          Console.WriteLine(aHasValue); // true

          ResultType<Hehe> omg;
          Console.WriteLine(omg.HasValue()); //true
          Console.WriteLine(omg.Value); // ConsoleApp10.Hehe
}

Zmienne a i b są sobie równoważne, a nie przekazałem wartości jawnie w a. Drugi przykład to przekazałem swoją inną własną strukturę. Nie musiałem nawet inicjalizować Result a i tak metoda HasValue() na zmiennej omg zwraca true. Gdybym miał klasę z jednym konstruktorem to byłoby to niemożliwe. Podsumowując łatwiej wyrazić klasą brak rezultatu - nullem.

edytowany 3x, ostatnio: error91, 2019-01-05 21:13

Pozostało 580 znaków

2019-01-05 22:07
Bambaryła
0
error91 napisał(a):

Na przykład dlatego, że struktura ma zawsze bezparametrowy konstruktor i domyślne wartości. Może to doprowadzić do kwiatków.

public struct Hehe
{

}

class Program
{
     static void Main(string[] args)
     {
          ResultType<bool> a = new ResultType<bool>();
          ResultType<bool> b = new ResultType<bool>(false);

          var aHasValue = a.HasValue(); 
          Console.WriteLine(aHasValue); // true

          ResultType<Hehe> omg;
          Console.WriteLine(omg.HasValue()); //true
          Console.WriteLine(omg.Value); // ConsoleApp10.Hehe
}

Zmienne a i b są sobie równoważne, a nie przekazałem wartości jawnie w a. Drugi przykład to przekazałem swoją inną własną strukturę. Nie musiałem nawet inicjalizować Result a i tak metoda HasValue() na zmiennej omg zwraca true. Gdybym miał klasę z jednym konstruktorem to byłoby to niemożliwe. Podsumowując łatwiej wyrazić klasą brak rezultatu - nullem.

Ty jedynie pokazałeś, że źle korzystasz ze struktur, u mnie działa normalnie. Poza tym, jak ci się udało zrobić strukturę z bezparometrowym konstruktorem?

  12      class Program                                                                                                                 
    1     {
    2         static void Main(string[] args)
    3         {
    4             var a = new ResultType<string>(null);
    5             var b = new ResultType<string>("");
    6             var c = new ResultType<Testowy>(null);
    7             var d = new ResultType<Testowy>(new Testowy());
    8  
    9             Console.WriteLine(a.HasValue());
   10             Console.WriteLine(b.HasValue());
   11             Console.WriteLine(c.HasValue());
   12             Console.WriteLine(d.HasValue());
   13         }
   14     }
   15  
   16     public class Testowy
   17     {
   18         public int name { get; set; }
   19         public string name2 { get; set; }
   20         public string Name3 { get; set; }
   21     }
   22  
   23     public struct ResultType<T>
   24     {
   25         public ResultType(T val)
   26         {
   27             Value = val;
   28         }
   29  
   30         public T Value { get; }
   31                                
   32         public bool HasValue()
   33         {                     
   34             return Value == null;
   35         }                        
   36     }  

Pozostało 580 znaków

2019-01-06 03:01
0
Bambaryła napisał(a):

Dlaczego wszyscy używają klasy zamiast struktury w takie sytuacji.

Bo użycie struktury nie da w takiej sytuacji żadnego zysku, a skutkuje dwoma problemami:

  • Jak już pokazano dla typów wartościowych mimo nieprzekazania wartości HasValue() zwróci true. To nie jest ładny ani czytelny kod.
  • Nie wpasuje się w żadną hierarchię dziedziczenia.
Bambaryła napisał(a):

Ty jedynie pokazałeś, że źle korzystasz ze struktur, u mnie działa normalnie.

Nie "działa normalnie", tylko za każdym razem wywołujesz konstruktor parametrowy. A problemem jest to, że można też wywołać konstruktor bezparametrowy.

Poza tym, jak ci się udało zrobić strukturę z bezparometrowym konstruktorem?

Pewnie w ten sposób, że po prostu nie da się bez.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2019-01-06 08:27
Bambaryła
0

Dziękuje. Czyli nie ma sensu, bo bym musiał używać jakiejś metody fabrykującej. Zysku na wydajności też nie będzie, dopóki nie zacznę na przykład tworzyć dużej ilości instancji tej struktury.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0