Przejdź do treści stopki
Iron Academy Logo
Naucz się C#
Naucz się C#

Inne Kategorie

Zrozumienie zmiennych i typów danych w C#

Tim Corey
28m 27s

W programowaniu w języku C# zmienne są podstawowymi elementami służącymi do przechowywania wartości danych. Zrozumienie, jak skutecznie definiować i używać zmiennych, ma kluczowe znaczenie dla pisania wydajnego i łatwego w utrzymaniu kodu. Zmienne mogą być różnych typów, w tym typów danych podstawowych, stałych i zmiennych typowanych dynamicznie, z których każda służy określonym celom. Dodatkowo konwersja typów, dynamiczny oraz var słowa kluczowe dodają elastyczność i odporność na błędy w programowaniu w C#.

Film Tima Coreya pt. "Dynamic vs Var w C#" zawiera kompleksowy przegląd tych pojęć. W tym artykułe omówimy kilka tematów poruszonych przez Tima, w tym:

  1. Różnica między Dynamic a Var
    • Podstawowe typy danych
    • Zmienne i stałe
  2. Dynamiczna automatyczna konwersja typów
  3. Wady dynamiki w rozwoju
  4. Dłączego i kiedy używać Dynamic
  5. Dłączego i kiedy używać Var

Dzięki zrozumieniuiuiuiuiu tych pojęć dzięki wyjaśnieniom Tima Coreya zyskasz głębszy wgląd w to, jak skutecznie zarządzać zmiennymi w języku C# i wykorzystywać je.

Różnica między Dynamic a Var

W C# var jest używane dla lokalnych zmiennych z niejawnie określonym typem, gdzie typ jest ustalany w czasie kompilacji, co zapewnia bezpieczeństwo typów i wsparcie dla IntelliSense. W przeciwieństwie dynamic pozwala zmiennym omijać sprawdzanie typów w czasie kompilacji, z typem określanym w czasie wykonania, oferując większą elastyczność, ale z ryzykiem błędów w czasie wykonania i obniżoną wydajnością.

Tim Corey wyjaśnia, że var zapewnia bezpieczeństwo typów dzięki określaniu typu w czasie kompilacji jako statyczne zmienne, podczas gdy dynamic oferuje elastyczność przy rozpoznawaniu typów w czasie wykonania, co może prowadzić do błędów w czasie wykonania i problemów z wydajnością.

Podstawowe typy danych

Tim rozpoczyna swoją prezentację w Visual Studio od przedstawienia podstawowych typów danych w języku C#. Tworzy on obiekt dynamic nazwany testDynamic, który może być przypisany do nowej wartości w dowolnym momencie, a jego typ danych może się dynamicznie zmieniać w czasie wykonania. To pokazuje poniższy kod:

// Declaration of a dynamic variable that can change types at runtime
dynamic testDynamic;
// Declaration of a dynamic variable that can change types at runtime
dynamic testDynamic;

Język C# udostępnia kilka podstawowych typów danych do obsługi różnego rodzaju danych. Typy całkowite zawierają int dla 32-bitowych liczb całkowitych ze znakiem, long dla 64-bitowych liczb całkowitych ze znakiem, short dla 16-bitowych liczb całkowitych ze znakiem oraz byte dla 8-bitowych liczb całkowitych bez znaku. Dla liczb zmiennoprzecinkowych, C# oferuje float dla wartości pojedynczej precyzji 32-bitowej, double dla wartości podwójnej precyzji 64-bitowej oraz decimal dla 128-bitowych precyzyjnych wartości dziesiętnych, idealnych do obliczeń finansowych. Typ danych char reprezentuje 16-bitowe znaki Unicode, podczas gdy typ bool jest używany dla prawdziwych lub fałszywych wartości. Dodatkowo typ danych string reprezentuje sekwencję znaków, umożliwiając przechowywanie i manipulację tekstem.

Te typy danych mają fundamentalne znaczenie dla programowania w języku C#, umożliwiając wydajne przechowywanie i przetwarzanie danych, co Tim pokazuje w kolejnych przykładach. Wiele zmiennych można zadeklarować i przypisać do typów całkowitych int w jednej linii, a każdy typ danych ma wartość domyślną, jeśli nie zostanie wyraźnie przypisana wartość początkowa. Zmienne stałe zachowują stałe wartości, zapewniając spójność w całym kodzie. Ponadto za pomocą tych typów danych można również deklarować zmienne instancji i zmienne statyczne, co zapewnia solidną i elastyczną strukturę programów.

Zmienne i stałe

Tim Corey w 1:21 próbuje stworzyć obiekt var nazwany testVar bez początkowego przypisania, co skutkuje błędem w czasie kompilacji, ponieważ var wymaga początkowego przypisania, aby określić jego typ:

// This will result in a compile-time error due to lack of type inference
// var testVar;
// This will result in a compile-time error due to lack of type inference
// var testVar;

To skutkuje czerwonym zygzakiem poniżej testVar, wskazującym na błąd. O 1:55 Tim wyjaśnia, że var musi mieć przypisany typ w momencie deklaracji. Na przykład:

// var assignment with type inference from the initial value
var testVar = 2; // testVar is inferred to be of type int
// var assignment with type inference from the initial value
var testVar = 2; // testVar is inferred to be of type int

Tim (2:44) demonstruje, że jeśli później spróbuje przypisać wartość podwójną do testVar, to spowoduje błąd, ponieważ testVar początkowo przypisano jako int:

// Attempting to change the type from int to double causes an error
// testVar = 1.1; // Error: Cannot implicitly convert type 'double' to 'int'
// Attempting to change the type from int to double causes an error
// testVar = 1.1; // Error: Cannot implicitly convert type 'double' to 'int'

Tim (3:17) podkreśla, że typ var jest ustawiany w momencie początkowego przypisania i później nie może się zmienić. Jeśli testVar jest początkowo przypisany jako wartość podwójna, zostanie określony jako podwójny:

// Another example with dynamic typing
var testVar = 2.1; // Now testVar is a double
// Another example with dynamic typing
var testVar = 2.1; // Now testVar is a double

Chociaż Tim nie porusza tematu zmiennych stałych, są one równie ważne w programach napisanych w języku C#. Stałe w C# są deklarowane przy użyciu słowa kluczowego const, po którym następuje typ danych i identyfikator stałej zmiennej, na przykład:

// Declaring a constant variable
const int MaxValue = 100;
// Declaring a constant variable
const int MaxValue = 100;

Stałym należy przypisać wartość w momencie deklaracji, której nie można zmienić podczas wykonywania programu, zapewniając niezmienne wartości dla logiki programu.

Dynamiczna automatyczna konwersja typów

Tim podkreśla, jak słowo kluczowe dynamic pozwala na elastyczne operowanie typami, działając trochę jak object, ale z dodatkowymi możliwościami. O 3:53 Tim demonstruje, jak dynamic może bezproblemowo konwertować pomiędzy różnymi typami podczas wykonywania, pokazując zdolność do obsługi obliczeń zawierających liczby całkowite i podwójne bez jawnego rzutowania, jak pokazano w jego przykładzie kodu:

// Demonstrating dynamic type conversion at runtime
dynamic testDynamic = 1;
testDynamic = testDynamic + 2.1;
Console.WriteLine(testDynamic); // Outputs 3.1 as it converts the integer to a double
// Demonstrating dynamic type conversion at runtime
dynamic testDynamic = 1;
testDynamic = testDynamic + 2.1;
Console.WriteLine(testDynamic); // Outputs 3.1 as it converts the integer to a double

Tutaj, Tim (4:39) ilustruje, że testDynamic początkowo przechowuje wartość całkowitą, ale bez trudu konwertuje ją na podwójną, gdy dodaje do niej 2.1, co skutkuje wyjściem 3.1.

Pomimo swojej elastyczności, Tim ostrzega przed nadmiernym stosowaniem dynamic z powodu kosztów wydajności wynikających z częstych konwersji typów. Podkreśla o 5:55, że dynamic powinno być używane oszczędnie w rozwoju C#, aby uniknąć niepotrzebnego obciążenia procesora i utraty sprawdzania typów w czasie kompilacji oraz wsparcia IntelliSense, co jest kluczowe dla utrzymania odpornych i bezbłędnych baz kodu.

Wady Dynamic in Development

Tim Corey ilustruje, jak dynamic może prowadzić do błędów w czasie wykonania i nieoczekiwanego zachowania w twoich aplikacjach. Zaczyna od pokazania, jak zadeklarować zmienną dynamiczną i przypisać jej początkowo pusty ciąg znaków, aby uniknąć natychmiastowego błędu. Następnie próbuje wywołać nieistniejącą metodę sayHi na zmiennej dynamicznej, co nie powoduje błędu w czasie kompilacji, ale skutkuje wyjątkiem w czasie wykonania, demonstrując kluczową wadę dynamic: brak sprawdzania w czasie kompilacji.

// Demonstrating lack of compile-time checks with dynamic
dynamic testDynamic = "";
// testDynamic.sayHi(); // Runtime error: method does not exist
// Demonstrating lack of compile-time checks with dynamic
dynamic testDynamic = "";
// testDynamic.sayHi(); // Runtime error: method does not exist

Ponadto o godz. 8:38 Tim pokazuje, w jaki sposób zmienne dynamiczne mogą zmieniać typy w czasie wykonywania, co może powodować nieoczekiwane zachowanie. Przypisuje obiekt Person do zmiennej dynamicznej, następnie przypisuje jej wartość tekstową i pokazuje, jak ta elastyczność może prowadzić do błędów logicznych i utrudniać debugowanie.

// Demonstrating the potential errors with dynamic type reassignment
dynamic testDynamic = new Person();
testDynamic = "Hi";
Console.WriteLine(testDynamic); // Works fine, but not ideal for type safety
// Demonstrating the potential errors with dynamic type reassignment
dynamic testDynamic = new Person();
testDynamic = "Hi";
Console.WriteLine(testDynamic); // Works fine, but not ideal for type safety

Tim wyjaśnia również, że zmienne dynamiczne nie są obsługiwane przez IntelliSense, co może prowadzić do błędów wykonania spowodowanych literówkami lub nieprawidłowymi nazwami metod. Na przykład, o 14:05, wywołuje nazwę właściwości Email, która nie istnieje, podkreślając, jak ten błąd pozostaje niezauważony aż do czasu wykonania. Kod kompiluje się bez błędów, ale zawodzi podczas wykonywania, gdy metody lub właściwości oczekiwane na obiekcie Person nie zostają znalezione na tekście.

// Demonstrating a runtime error due to missing property
// testDynamic.Email = "Test@test.com"; // property not found until runtime
// Demonstrating a runtime error due to missing property
// testDynamic.Email = "Test@test.com"; // property not found until runtime

Zalety używania słowa kluczowego Var

W przeciwieństwie var jest silnie typowany i zapewnia sprawdzanie typu podczas kompilacji oraz wsparcie dla IntelliSense. Dzięki temu wszelkie problemy związane z typami danych są wykrywane na etapie tworzenia oprogramowania, co sprawia, że kod jest bardziej niezawodny i łatwiejszy w utrzymaniu. Tim Corey demonstruje to, tworząc zmienną var i przypisując do niej obiekt Person:

// Using var for strongly-typed assignments
var testVar = new Person();
testVar.FirstName = "Sue";
testVar.LastName = "Storm";

// The use of IntelliSense assists in reducing runtime errors
Console.WriteLine(testVar.SayHello()); // Ideally a method in Person class
// Using var for strongly-typed assignments
var testVar = new Person();
testVar.FirstName = "Sue";
testVar.LastName = "Storm";

// The use of IntelliSense assists in reducing runtime errors
Console.WriteLine(testVar.SayHello()); // Ideally a method in Person class

Próba wywołania nieistniejącej metody lub ponownego przypisania zmiennej var do innego typu zostanie uchwycona w czasie kompilacji, zapobiegając potencjalnym błędom w czasie wykonania.

// Attempting to change type results in compile-time errors with var
// testVar = "Hi"; // Compile-time error
// Attempting to change type results in compile-time errors with var
// testVar = "Hi"; // Compile-time error

Typ zwracanej wartości metody

O 15:05 Tim demonstruje, że można również zwrócić typ dynamic z metody, ale nie można zwrócić var. Na przykład:

// Method returning a dynamic type
public dynamic GetMessage() {
    return "This is a test";
}
// Method returning a dynamic type
public dynamic GetMessage() {
    return "This is a test";
}

Podjęcie próby zwrócenia var spowodowałoby błąd w czasie kompilacji, ponieważ sygnatura metody musi określać konkretne typy zwracane.

Dłączego i kiedy używać Dynamic

Tim omawia konkretne scenariusze, w których dynamic staje się niezbędny. Wyjaśnia on, że C# jest zasadniczo językiem silnie typowanym, co oznacza, że każdej zmiennej przypisany jest określony typ, który pozostaje niezmienny przez cały jej cykl życia. Stanowi to kontrast w stosunku do języków takich jak JavaScript, w których zmienne mogą dynamicznie zmieniać typy.

Tim, o godz. 18:14, wyjaśnia, że chociaż język C# jest zaprojektowany z myślą o zmiennych silnie typowanych, istnieją sytuacje, zwłaszcza podczas interakcji z systemami zewnętrznymi lub językami takimi jak Python, Ruby lub obiektami COM, w których typowanie dynamiczne może być korzystne. Używa przykładu integracji z Python API, aby podkreślić praktyczną potrzebę stosowania dynamic. W takich przypadkach posiadanie elastycznego systemu typów, który może dostosować się do różnych typów danych z zewnętrznych źródeł, upraszcza interakcję.

Tim Corey o 18:44 podkreśla, że choć dynamic jest użyteczne do interakcji między językami, na ogół nie jest zalecane dla kodu czystego C# z powodu utraty sprawdzania błędów w czasie kompilacji i wsparcia dla IntelliSense. Ostrzega, że elastyczność dynamic wiąże się z kosztami wydajności i bezpieczeństwa typów, czyniąc go mniej pożądanym wyborem do regularnego programowania w C#, gdzie preferowane powinny być silnie typowane zmienne.

Dłączego i kiedy używać słowa kluczowego Var

Tim następnie omawia użycie i filozofię stojącą za słowem kluczowym var w C#. Zauważa, że istnieją dwa główne obozy, jeśli chodzi o użycie var: Ci, którzy wolą używać go wyłącznie, i ci, którzy wolą jawne deklaracje typów.

Tim, o 19:43, wyjaśnia, że zwolennicy var twierdzą, że zachęca to do lepszych konwencji nazewnictwa, czyniąc kod samodokumentującym się. Uważają oni, że nazwy zmiennych powinny być na tyle opisowe, aby przekazywały typ bez konieczności wyraźnej deklaracji.

Z drugiej strony (20:46) zwolennicy jawnych deklaracji typów argumentują, że widoczność rzeczywistego typu bezpośrednio w kodzie pozwala od razu rozpoznać, jaki jest typ zmiennej lokalnej, bez konieczności najeżdżania kursorem na zmienną w celu sprawdzenia jej typu. Na przykład:

// Explicit type declaration provides clarity
string firstName = "Tim";
// Explicit type declaration provides clarity
string firstName = "Tim";

Jest to preferowane przez niektórych, ponieważ usuwa wszelkie wątpliwości co do typu zmiennej.

Tim dzieli się swoim zrównoważonym podejściem o 21:15, stwierdzając, że zazwyczaj używa jawnych typów dla powszechnych typów danych jak string, int, double i decimal, ponieważ sprawia to, że kod jest bardziej przejrzysty i unika potencjalnych problemów, takich jak pomylenie double i decimal. Na przykład:

// Explicit type ensures there's no ambiguity between float types
double myMoney = 1.1; // This is a double
decimal myMoney = 1.1M; // This is a decimal
// Explicit type ensures there's no ambiguity between float types
double myMoney = 1.1; // This is a double
decimal myMoney = 1.1M; // This is a decimal

Tim podkreśla, że jawne deklarowanie typu zapewnia użycie właściwego typu, zwłaszcza gdy może dojść do zamieszania między podobnymi typami.

Jednak Tim również przyznaje, że var może być szczególnie przydatne, gdy mamy do czynienia z długimi lub skomplikówanymi typami. Podaje przykład o 23:37, gdzie deklaracja List<List<Person>> może być rozwlekła:

// Declaring a complex type using var
var rounds = new List<List<Person>>();
// Declaring a complex type using var
var rounds = new List<List<Person>>();

Demonstruje również jego użyteczność w pętlach foreach (23:55):

// Utilizing var in loop for cleaner code
foreach (var round in rounds) {
    // Do something with each round
}
// Utilizing var in loop for cleaner code
foreach (var round in rounds) {
    // Do something with each round
}

Tim konkluduje, zauważając, że choć var może zmniejszyć rozwlekłość, kluczowe jest upewnienie się, że nazwy zmiennych są jasne i opisowe, aby zachować czytelność i uniknąć zamieszania.

Równoważąc użycie var z jawnymi typami, programiści mogą pisać klarowny, łatwy do utrzymania i wydajny kod, korzystając ze ster w obu podejściach stosownie do kontekstu.

Var jako anonimowy obiekt

Tim omawia użycie var w sytuacjach, gdzie typ nie jest jawnie znany lub podczas pracy z anonimowymi typami. Demonstruje to, tworząc w locie obiekt anonimowy, który nie ma wcześniej zdefiniowanego typu. Oto kod, którego używa:

// Creating an anonymous object with var
var myItem = new { FirstName = "Tim", Email = "test@test.com" };
// Creating an anonymous object with var
var myItem = new { FirstName = "Tim", Email = "test@test.com" };

Tim, o 25:30, wyjaśnia, że skoro ten obiekt jest anonimowy i nie ma konkretnej nazwy typu, jedynym sposobem deklaracji zmiennych dla niego jest użycie var. To podejście pozwala na tworzenie i używanie obiektów bez potrzeby definiowania formalnej klasy.

Aby zilustrować, jak to działa w praktyce, Tim pisze (25:52):

// Outputting properties of an anonymous object
Console.WriteLine($"Hello {myItem.FirstName}: your email is {myItem.Email}");
// Outputting properties of an anonymous object
Console.WriteLine($"Hello {myItem.FirstName}: your email is {myItem.Email}");

Kiedy uruchamia kod o 26:25, wyjściem jest:

To pokazuje, że var może obsługiwać właściwości anonimowego obiektu, a Visual Studio dostarcza wsparcie dla IntelliSense dla tych właściwości, pomimo że obiekt jest anonimowy.

Tim, o 26:54, wyjaśnia, że preferuje używanie jawnych typów dla prostych i powszechnych typów jak string, liczby całkowite i instancje klas, ponieważ sprawia to, że kod jest bardziej przejrzysty. Jednak używa var w przypadkach, gdy typ jest albo długi, skomplikówany, albo nie jest jawnie znany, na przykład z anonimowymi typami lub skomplikówanymi deklaracjami typów.

Wnioski

I oto masz—jasne zrozumieniuiuiuiuie zmiennych i typów danych w C#, wraz ze strategicznym wykorzystaniem słów kluczowych var i dynamic. Podążając za zrównoważonym podejściem Tima Coreya, możesz zapewnić bezpieczeństwo typów i przejrzystość w swoim kodzie z var słowem kluczowym, jednocześnie korzystając z elastyczności dynamic słowa kluczowego w specyficznych scenariuszach, takich jak interakcja z zewnętrznymi systemami.

Aby uzyskać bardziej szczegółowe informacje, koniecznie obejrzyj wideo Tima Coreya na temat "Dynamic vs Var in C#" i sprawdź jego kanał YouTube po dalsze tematy związane z nauką C#.

Hero Worlddot related to Zrozumienie zmiennych i typów danych w C#
Hero Affiliate related to Zrozumienie zmiennych i typów danych w C#

Zarabiaj więcej, dzieląc się tym, co kochasz

Tworzysz treści dla deweloperów pracujących z .NET, C#, Java, Python, czy Node.js? Zamień swoją wiedzę specjalistyczną na dodatkowy dochód!

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie