Typy wartościowe w C#
Cel: Napisz aplikację, która z listy wyboru typów zmienny zwróci ich rozmiar
W języku C# zmienne są podzielone według poniższego rodzaju:
- typy wartościowe
- typy referencyjne
- typy wskaźnikowe
Zanim przystąpimy do rozwiązania podanego celu zapoznamy się z listą dostępnych typów wartościowych i ich zakresem
Typ | Reprezentacja | Zakres |
bool | typ logiczny | true lub false |
byte | 8-bitowa liczba całkowita | 0 do 255 |
char | 16-bitowy znak z tablicy Unicode | U +0000 do U +ffff |
decimal | 128-bitowa wartość dziesiętna z dokładnością 28-29 cyfr znaczących | (-7.9⋅1028 do 7.9⋅1028)/100 do 28 |
double | 64-bitowa wartość o podwójnej precyzji używana do obliczeń zmiennoprzecinkowych | (+/-)5.0⋅10-324 do (+/-)1.7⋅10308 |
float | 32-bitowa wartość o pojedynczej prezycji używana do obliczeń zmiennoprzecinkowych | -3.4⋅1038 do + 3.4⋅1038 |
int | 32-bitowa liczba całkowita | -2 147 483 648 do 2 147 483 647 |
long | 64-bitowa liczba całkowita | -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807 |
sbyte | 8-bitowa liczba całkowita | -128 do 127 |
short | 16-bitowa liczba całkowita | -32 768 do 32 767 |
uint | 32-bitowa liczba całkowita (bez możliwości przechowywania liczb ujemnych) | 0 do 4 294 967 295 |
ulong | 64-bitowa liczba całkowita (bez możliwości przechowywania liczb ujemnych) | 0 do 18 446 744 073 709 551 615 |
ushort | 16-bitowa liczba całkowita (bez możliwości przechowywania liczb ujemnych) | 0 do 65 535 |
Krok 1. Układ komponentów na formatce
Na formatce umieszczamy poniższe komponenty
- Label- sztuk 1
- ComboBox- sztuk 1
- Button- sztuk 3
Komponent Label posłuży nam do wyświetlenia informacji zwrotnej o rozmiarze typu zmiennej, a komponent ComboBox będzie pełnił rolę kontenera na sztywno wprowadzone nazwy typów wartościowych języka C#.
Krok 2. Zwracamy rozmiar dowolnego typu zmiennej na przykład typu float
Do tego celu wykorzystamy zdarzenie kliknięcia klawisza a treść komunikatu wyślemy do komponentu Label
Wykorzystamy jednoargumentowy operator siezeof(), który zwraca liczbę bajtów zajmowaną przez zmienną danego typu. Instrukcja zwracająca rozmiar
label1.Text = Convert.ToString(sizeof(float))+" B; ";
Jeżeli chcesz zmierzyć rozmiar zadeklarowanej zmiennej, to należy użyć polecenia z klasy Marshal (przestrzeń nazw using System.Runtime.InteropServices;)
int x;
int rozmiar = Marshal.SizeOf(x);
Przykładowa zawartość funkcji obsługującej kliknięcie klawisza może wyglądać jak poniżej
private void Button1_Click(object sender, EventArgs e)
{
label1.Text = Convert.ToString(sizeof(float))+" B";
}
Jeżeli chcemy odczytać przedział zakresu dla danego typu zmiennych, to używamy poleceń MinValue i MaxValue przypisanych przy klasie wybranego typu. Zmodyfikowane ciało funkcji przyjmie postać:
label1.Text = Convert.ToString(sizeof(float))+" B; ";
label1.Text = label1.Text + " min:" + float.MinValue.ToString() + " max:" + float.MaxValue.ToString();
Krok 3. Ustalamy właściwości komponentu ComboBox
Wygląd stylu komponentu ustalimy na DropDownList
Zawartość treści listy komponentu ComboBox wprowadzamy poprzez wbudowany edytor kolekcji ciągów listy, który przypisany jest do właściwości Items
Każdy kolejno wprowadzony wiersz tworzy kolekcję listy
Krok 4. Odczyt aktywnego indeksu komponentu ComboBox
Wprowadzone wiersze do kolekcji są indeksowane od pozycji 0 wzwyż. Jeżeli nic nie wybrano z listy ComboBox, to aktywny indeks wynosi -1 (minus jeden). Sprawdzenie aktywnego indeksu komponentu ComboBox odbywa się poprzez polecenie SelectedIndex, na przykład
comboBox1.SelectedIndex
Odczyt aktywnego tekstu dla tego komponentu, to wykonanie instrukcji
comboBox1.Text
Wykorzystamy te instrukcje oraz instrukcję switch w celu zautomatyzowania odczytu rozmiarów i zakresów wprowadzonych typów wartościowych do kolekcji komponentu ComboBox
Krok 5. Zwracamy komunikat o rozmiarze i zakresie wybranego typu zmiennych
Instrukcja zaznaczenia switch, wybiera jedną z sekcji case po sprawdzeniu dopasowania wzorca. W naszym rozwiązaniu musimy zadbać o prawidłową kolejność definiowania wzorca sekcji case. Kolejność musi być zgodna z kolejnością wprowadzonej kolekcji komponentu ComboBox.
Przykładowy komunikat wysyłany do komponentu Label może być zrealizowany jak poniżej
private void Button2_Click(object sender, EventArgs e)
{
string s = "Typ: "+comboBox1.Text +"; rozmiar:";
switch (comboBox1.SelectedIndex)
{
case 0: label1.Text =s + Convert.ToString(sizeof(bool)) + "B";break;
case 1: label1.Text =s + Convert.ToString(sizeof(byte)) + "B; min: "+byte.MinValue.ToString()+", max:" +byte.MaxValue.ToString();break;
case 2: label1.Text = s + Convert.ToString(sizeof(char)) + "B; min: " + char.MinValue.ToString() + ", max:" + char.MaxValue.ToString(); break;
case 3: label1.Text = s + Convert.ToString(sizeof(decimal)) + "B; min: " + decimal.MinValue.ToString() + ", max:" + decimal.MaxValue.ToString(); break;
......
......
......
case 12: label1.Text = s + Convert.ToString(sizeof(ushort)) + "B; min: " + ushort.MinValue.ToString() + ", max:" + ushort.MaxValue.ToString(); break;
}
}
Pełny kod zapisany w pliku Form1.cs utworzonej formatki
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace rozmiarZmiennej
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
label1.Text = Convert.ToString(sizeof(float))+" B; ";
label1.Text = label1.Text + " min:" + float.MinValue.ToString() + " max:" + float.MaxValue.ToString();
}
private void Button2_Click(object sender, EventArgs e)
{
string s = "Typ: "+comboBox1.Text +"; rozmiar:";
switch (comboBox1.SelectedIndex)
{
case 0: label1.Text =s + Convert.ToString(sizeof(bool)) + "B";break;
case 1: label1.Text =s + Convert.ToString(sizeof(byte)) + "B; min: "
+ byte.MinValue.ToString()+", max:"
+ byte.MaxValue.ToString();break;
case 2: label1.Text = s + Convert.ToString(sizeof(char)) + "B; min: "
+ char.MinValue.ToString() + ", max:"
+ char.MaxValue.ToString(); break;
case 3: label1.Text = s + Convert.ToString(sizeof(decimal)) + "B; min: "
+ decimal.MinValue.ToString() + ", max:"
+ decimal.MaxValue.ToString(); break;
case 4: label1.Text = s + Convert.ToString(sizeof(double)) + "B; min: "
+ double.MinValue.ToString() + ", max:"
+ double.MaxValue.ToString(); break;
case 5: label1.Text = s + Convert.ToString(sizeof(float)) + "B; min: "
+ float.MinValue.ToString() + ", max:"
+ float.MaxValue.ToString(); break;
case 6: label1.Text = s + Convert.ToString(sizeof(int)) + "B; min: "
+ int.MinValue.ToString() + ", max:"
+ int.MaxValue.ToString(); break;
case 7: label1.Text = s + Convert.ToString(sizeof(long)) + "B; min: "
+ long.MinValue.ToString() + ", max:"
+ long.MaxValue.ToString(); break;
case 8: label1.Text = s + Convert.ToString(sizeof(sbyte)) + "B; min: "
+ sbyte.MinValue.ToString() + ", max:"
+ sbyte.MaxValue.ToString(); break;
case 9: label1.Text = s + Convert.ToString(sizeof(short)) + "B; min: "
+ short.MinValue.ToString() + ", max:"
+ short.MaxValue.ToString(); break;
case 10: label1.Text = s + Convert.ToString(sizeof(uint)) + "B; min: "
+ uint.MinValue.ToString() + ", max:"
+ uint.MaxValue.ToString(); break;
case 11: label1.Text = s + Convert.ToString(sizeof(ulong)) + "B; min: "
+ ulong.MinValue.ToString() + ", max:"
+ ulong.MaxValue.ToString(); break;
case 12: label1.Text = s + Convert.ToString(sizeof(ushort)) + "B; min: "
+ ushort.MinValue.ToString() + ", max:"
+ ushort.MaxValue.ToString(); break;
}
}
private void Button3_Click(object sender, EventArgs e)
{
this.Close();
}
}
}