https://files.fm/u/xqkbybffq
Zdravím.
Jakej je přesně rozdíl mezi objectem a znakovým řetězcem (v tomto kontextu)? Děkuji.
Fórum › .NET
Object a znakový řetězec...
žádná, v C# jsou už jenom objekty a i jednoduché proměnné jsou chápány jako objekty
metoda .ToString je metoda která ti pomůže převést třeba typ Int32 na String....používá se to dost často
třeba
Int32 cislo = 0;
Console.WriteLine("{0}", cislo.ToString() );
Chápu, takže:
Int32 cislo = 0
Int32 (mohl bych napsat i Int) je typ proměnné
cislo je název proměnné
0 je obsah proměnné
Ale.... Console.WriteLine("{0}", cislo.ToString() ); | ta instance Console.Write.Line je ze třídy System.Text (asi)
{0} je "placeholder", cislo je hodnota, co se místo toho placeholderu má zobrazit, a to "ToString()" je metoda? K čemu tam je, a proč je na konci?
#4 safranek
já nevím proč ti s tím JerryM mate hlavu, a ještě to má navíc blbě, stačí:
int cislo = 45;
Console.WriteLine("{0}", cislo);
//vypíše: 45
// když už s tím začal, na tomto příkladu to pochopíš:
int a=44, b=55, c=66;
Console.WriteLine("RGB={0},{1},{2}", a, b, c);
//vypíše: RGB=44,55,66
#4 safranek
Console.WriteLine vypisuje řádek do Konzolové aplikace
class TestClass
{
private readonly int _hodnota;
private readonly string _nazev;
TestClass(string nazev, int hodnota)
{
_hodnota = hodnota;
_nazev = nazev; //pro jednoduchost neřeším, že string může být null
}
public override string ToString()
{
return string.Format("Nazev: {0}, Hodnota: {1}", _nazev, _hodnota);
}
}
//---------------------------------
...
TestClass A = new TestClass("blabla", 8);
string txt = A.ToString();
// do txt vloží text: Nazev: blabla, Hodnota: 8
...
TestClass(string nazev, int hodnota)
{
_hodnota = hodnota;
_nazev = nazev; //pro jednoduchost neřeším, že string může být null
}
Dobře, to sem ani nevěděl, že můžeš definovat typ proměnné (string; int) v parametru instance třídy. Takže sis udělal třídu "TestClass" a v jejím parametru jsi nabušil, že proměnná typu string má název "nazev", a proměnná typu int má hodnotu "hodnota". Jakej maj pak ale smyslu ty položky "_hodnota = hodnota" a "_nazev = nazev". Proč ty _podtržítka a k čemu ty dva řetězce jsou?
TestClass A = new TestClass("blabla", 8);
string txt = A.ToString();
Tady chápu, jak je to "protagovaný https://files.fm/u/nurv69372 ", ale trošku mi nejde na mysl ten kus kódu. A dá se nějak zjistit, kolik (a v jaké formě zápisu) mi daná třída nabízí (mám říct instancí nebo metod?)
https://files.fm/u/w9um9r22w
K čemu mi takovej prográmek vlastně bude, když stejně nemohu změnit hodnoty?
#7 safranek
Máš zbytečně moc otázek, toto je pouze ukázka toho, k čemu může sloužit ToString(). Nic jiného v tom nehledej.
Dobře, to sem ani nevěděl, že můžeš definovat typ proměnné (string; int) v parametru instance třídy
Toto je konstruktor třídy, až budeš chápat konstruktory, tak pochopíš.
má název "nazev", a proměnná typu int má hodnotu "hodnota". Jakej maj pak ale smyslu ty položky "_hodnota = hodnota" a "_nazev = nazev". Proč ty _podtržítka a k čemu ty dva řetězce jsou?
Je to jen název, může se to jmenovat, třeba hatlapatla nebo _hatlapatla je to jedno, jde jen o to, aby to v dávalo nějaký smysl... já jsem si původně myslel, že Ti to pomůže v orientaci v ukázce
K čemu mi takovej prográmek vlastně bude, když stejně nemohu změnit hodnoty?
Teď je to k ničemu, někdy se používají ve třídách neměnné "proměnné", může jít třeba o identifikátor typ komprese dat v souboru, který jednou načteš při načítání souboru a po dekódování zahodíš. Mohl jsem tam dát i klasickou proměnnou... Prostě, zvolil jsem jeden z 9999999999999 způsobů.
hele důchodče... dřív v C# .NET 4.7.2 a všeobecně ve starém .NET byla console součástí systému okenní aplikace vytvářené v C# ale to už teď v .NET core neni.... tam si musíš okno konsole vytvořit sám, chápeš jo ? třeba když si chceš v průběhu vývoje okenní aplikace v C# WPF .NET5/6 dopřát komfort Console, musíš si to tam nahňahňat ručně:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ConsoleAllocator.ShowConsoleWindow();
Console.WriteLine("Hello ");
}
}
static class ConsoleAllocator
{
[DllImport(@"kernel32.dll", SetLastError = true)]
static extern bool AllocConsole();
[DllImport(@"kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport(@"user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport(@"kernel32.dll")]
private static extern bool FreeConsole();
const int SwHide = 0;
const int SwShow = 5;
public static void ShowConsoleWindow()
{
var handle = GetConsoleWindow();
if (handle == IntPtr.Zero)
{
AllocConsole();
}
else
{
ShowWindow(handle, SwShow);
}
}
public static void HideConsoleWindow()
{
var handle = GetConsoleWindow();
ShowWindow(handle, SwHide);
FreeConsole();
}
}
}
A] mě se konzole spustí hned a sama, jakmile vyberu položku pro spuštění rozdělaného projektu, pod volbou "Analyzovat". https://files.fm/u/cz2z5ykzq
B] kdes vyhrabala tu pitomost, že sem důchodce. Je mi 25, a začínám od nuly. :)
Me jde o toto: kdyz se clovek uci napr. Armensky (prirozeny jazyk), musi se naucit armenske pismo (sice pri programovani se uzije latinka, ale plno apostrofu a zavorek ma tak specifickej vyznam, ze muzeme mluvit o atypickem pismu z 50%), potom slovicka (a to mi tady dela nejvetsi obavy, stale porad nevim presne, co vsechno muzu do toho kodu nabouchat, A HLAVNE, CO TO UDELA - a to je nejvetsi problem, a potom syntaxi (ta je i C#, ale tu mi do znacne miry opravi VS2019, stejne jako Word opravi chyby v pravopise).
O to mi jde...
Clovek se taky neuci cizi jazyk (ikdyz, u polstiny a srbochorvatstiny by to mozna slo) tim, ze otevre noviny, a tam se snazi tipnout/uhadnout vyznam ciziho slova, a kdyz se mu to nepovede, tak se pta na kazdy slovo nekoho...
A] to tam VS2019 doplní sám, podle názvu projektu - když otevřu projekt faktorial, bude tam napsáno faktorial: https://files.fm/u/4qvjjq2su
B] Z Arménie nejsem, uvedl sem to jako příklad toho, do jaké míry je učení přirozených i programovacích jazyků podobné, a do jaké míry nepodobné.
aha no a ještě nám prozraď jaký typ toho projektu sis pro své začátky v C# zvolil :
1/ MS VS 2019 C# WinForms .NET Framework 4.7.2 (4.8) ???
2/ MS VS 2019 C# WPF .NET Framework 4.7.2 (4.8) ???
3/ MS VS 2019 C# Console .NET Framework 4.7.2 (4.8) ???
4/ MS VS 2019 C# WinForms .NET core .NET5/6 ???
5/ MS VS 2019 C# WPF .NET core .NET5/6 ???
6/ MS VS 2019 C# Console .NET core .NET5/6 ???
7/ MS VS 2019 C# ASP MVC .NET core .NET5/6 Razor/Blazor ???
#11 safranek
Začni s tímto:
Soubor->Nový..->Projekt
pak zapomeň vše co jsi dosud četl v knihách, pak si poslechni tento tutoriál (je sice starší, takže se některé věci píšou trošku jinak - zjednodušují se, ale to nevadí) minimálně do lekce 43. V tom založeném projektu si to můžeš zkoušet. Až si pozorně poslechneš celý (16-43) tutoriál, tak budeš umět vše potřebné pro napsání prvních programů v konzole, a až pak se začni ptát, do té doby to nemá cenu.
Potom se rozhodneš jestli budeš psát WPF, netCore, WF apd. tyto naučené základy použiješ všude.
A] ten "projekt faktorial" byl dělanej podle té knihy.
B] No, jak říkám, já jel zatím jen podle knihy, takže: https://files.fm/u/qfkczqtwe po každý konzolová aplikace (ale dělal sem i .dll) [červená], a po každý sem tam nechal ten .NET 3.1, [zelená].
#16 safranek
.NET Core 3.1 je už bohužel zastaralá mrtvá technologie. :) teď už je .NET5 a od listopadu 2021 bude .NET6 :)
jestli neumíš vubec nic a chceš jenom začátky tak zvol
MS VS 2019 C# Console .NET Framework 4.7.2 (4.8)
nebo
MS VS 2019 C# Console .NET core .NET5/6
což je stejný, obojí je konzolová aplikace. Neni tam samozřejmě grafika ale jen text. Jsou tu ale rozdíly protože .NET core je novější a multiplatformní a většina knih je právě na starej .NET 4.7.2. Rozdíly se pak doučíš velmi rychle.... těch rozdílů moc neni.
Až budeš pokračovat časem dál tak se pak rozhodneš jestli chceš dělat jen desktop s knihovnou .NET5/6 WPF nebo se vrhneš na tvorbu webových stránek s ASP .NET5/6.
BDS: ono je problém, že jeden z těch .NET core vybrat musím, nemůžu v tom VS2019 vybrat "nic". Když zvolím konzolové aplikace, tak mám na výběr z 3.1 a z 5.0. https://files.fm/u/zfaxazhne
Úvaha byla, že starší znamená prověřenější, navíc se mi líbila ta hláška "Dlouhodobá podpora". A navíc v knize je přímo napsáno k tomuto kroku "... ponecháme přednastavenou volbu".
Definici konstruktoru jsem vzal odtud (už předtím, než sem vůbec sem začal psát) : https://cs.wikipedia.org/wiki/Konstruktor a mohu to odrecitovat jak básničku, ale co si z toho jako člověk má odnést, to je mi záhadou...?
To video z odkazu ( https://www.youtube.com/watch?v=k2KqJEP05Z4 ) jsem zkusil, a hodilo to tento fajl https://files.fm/u/f9chrs8ap hned z počátku. Kde je problém? Přečtu to - nemůžeš to otevřít soubor Form1.cs [Design]
To musí bejt nějaká pitomina, proč to cpe text "[Design]" do přípony?
Na tom je nejdivnější, že jsem postupoval přesně podle videa, a navíc to bylo jen o o vytvoření prázdného projektu. A to, že tu mám vyšší verzi VS a .NET neznamená, že vytváření projektu je tak diametrálně odlišné.
#19 safranek
zapni VisualStudioInstaller a nainstaluj toto:
ta chybová hláška s tím souvisí, ten tutoriál je dělaný v NET. Framework
Tutoriál začni jak jsem už psal lekcí 16, tam jsou první všeobecné věci co musíš vědět (díly 1-15 se věnují WindowsForms)
1/ jestli ses naprosto svobodně a samostatně rozhodl pro multiplatformní .NET core tak vybrat zásadně .NET5 protože je novější než 3.1 a od listopadu 2021 zvolit pak .NET6. (starý .NET4.7.2/4.8 a starší verze je mrtvý)
2/ základy objektového programování v Csharp např. Learning Object Oriented Programming In C-sharp 5.0 Book.pdf nebo C sharp OOP Object-Oriented Programming [2011].pdf
objekty jsou stejné bez ohledu na knihovnu starou .NET nebo novou .NET core .NET5/6
tady máš knížky (soubor je RAR, heslo admin):
https://uloz.to/file/tvld0bPgVsgS/c-sharp-books-heslo-admin-zip#!ZJLmMGR1MTEuZQZ2A2SzZmSxZzD2H2qmIzyZD3OUJx9hZzAx
3/ sice nechápu proč se učíš programovat až v 25 ale ... ty to víš .. :)
4/ ideální by bylo kdyby ses přidal k nějaký firmě jako programátor junior :) protože dnes se vývoj v C# orientuje hlavně na ASP .NET5/6 pro web (je to nejlépe placené ale musíš znát i HTML5+CSS3+JavaScript) a dále pak pak C# UNITY pro hry a C#+WPF pro desktop (raritně i C#+WinForms) a jeden z těch tří směrů si budeš muset vybrat. Otázka je jestli spíš nechceš Javu a být programátorem v Javě v nějaký pražský bance za 160K měsíčně. Jestli se učíš programovat jenom pro radost tak to je v dnešní době pěkná blbost :)
5/ Na knihovnu .NET 4.x.x WindowsForm se vyser. Nikde ve firmě tě nezapěstnaj se znalostí této knihovny. Dnes se preferuje už jen - bohužel - knihovna .NET WPF (ta nová i ta stará). Slovo "[Design]" ti to tam cpe protože sis otevřel asi nejspíš starej WinForms (.NET WF) projekt a snažíš se dělat grafické uživatelské rozhranní. Otevři si projekt Console a nauč se nejdřív objekty a základy Csharp bez grafiky.
6/ WPF je náročnější než WF protože se vlastně musíš kromě Csharp naučit i XAML což je další jazyk nezbytný pro tvorbu GUI.
7/ Měl bys vědět, že Microsoft už zveřejnil nástupce knihoven WF a WPF a jmenuje se WinUI :)
https://microsoft.github.io/microsoft-ui-xaml/
a je multiplatformní. Opět nemá smysl se to učit pokud nejsi někde zaměstnán u nějaké firmy.
Chronologie knihoven od 90 let je: MFC (ta už se používá jen pro zastaralé projekty které se musí udržovat a je jen v C++), WinForms (opět zastaralá a je to nástupce MFC), WPF (stále aktuální a je to nástupce WinForms), WinUI - je to nástupce WPF a je zde plná podpora pro nové projekty od .NET6, a je to nejnovější knihovna.
.NET WinForms je zastaralá knihovna z roku 2001, je sice předělaná do nového .NET core .NET5/6 ale problém je v tom, že ji firmy nechtějí. to znamená že v čr jako programátor nenajdeš práci v .NET WinForms. Ano, WinForms je skvělá ale ... v čr ji nikdo nechce, na západ od nás v Německu, Francii, USA atd. se běžně pro desktopové aplikace používá stejně tak jako knihovna MFC. ...jenomže ... češi .. to je "jiný" národ ...
dotaz "proč" se neučit WinUI .... no jde o to... třeba si skrytý milionář a nevíš co se životem :) v tom případě je pro tebe WinUI ideální :) :) :) :) :)
#24 safranek
Ve Windows Forms můžeš napsat všechny běžné aplikace (něco jako je notepad, malování, kancelářské programy, přehrávače hudby, databáze, správce souborů, systémové nástroje..), ale především chybí automatické přizpůsobení DPI (toto lze vyřešit, že aplikaci sestavíš v NET.Core), hardwarové urychlení grafiky, a to že všechny ovládací prvky musí být v jednom vlákně). Je to starší věc, která nepočítá se podivnými displeji (zoomování aplikace lze provést i ve WF, ale dá to větší práci než ve WPF - pokud ovládáš XAML). Ale na druhou stranu, napsat program v ve WF je nejsnadnější. Ale zase pokud se začneš učit ve WF, přecházet na WPF bude pro tebe těžší. Největší mínus je asi to, že je to zastaralý způsob.
Já dělám aplikace ve WF, protože když jsem se začínal učit programovat, tak nic jiného nebylo a teď už jsem líný se učit něco jiného. (Jednu dobu jsem zkoušel i WPF, ale zjistil jsem, že to co potřebuju udělám i WF, ale mnohem rychleji.) Programování mám jako koníčka, takže to, že je WPF dobře placené mi je celkem jedno.
Pokud se programování chceš věnovat roky, nebo psát pro více systémů, nebo graficky náročnější vícevláknové aplikace nebo hry doporučuju se věnovat WPF - xamlu než WF.
Nicméně tutoriálem, který jsem zde uvedl (od dílu 16) nic nezkazíš - je univerzální.
Ještě jsem zapomněl důležitou výhodu WPF, a to je snadné stylování a přestylování aplikací a pokročilý data-binding. Ve WF se styly musí řešit "ručním" překreslováním komponent a nebo překreslováním pomocí bitmap. U WPF jsou na to nástroje už i v designeru (zaoblení, přechody, stíny..)
https://www.youtube.com/watch?v=vn4hIZ3v38Y&list=PL8428DD4872FA7FB3&index=17 3:26
Proč má výsledek, že cislo = 50, když vybere 2. konstruktor? Protože nastavil this.cislo = cislo? Pokud by teda napsal this.cislo = 222, bude hodnota "cislo" 222?
#30 safranek
protože první konstruktor bez parametru new A() nastavuje cislo na 100, ale druhý konstruktor nastavuje proměnnou podle uvedeneho parametru new A(nejake_cislo_int) nastaví cislo dle uvedeneho parametru
to znamená, že A aa = new A(123); by nastavilo hodnotu aa.cislo na 123
https://files.fm/u/utmd28ube
Takže tohle 1. je taky konstruktor sám o sobě? Ale v 2. tom druhém konstruktoru parametr "new A(nejake_cislo_int)" není.
A jen tak naokraj, proč máš to "aa" takle zdvojené?
A aa = new A(123)
#34 safranek
class si můžeš představit jako obecnou bednu, kterou musíš "otypovat", tedy určit jaké bude mít možnosti
class BednaSVercajkem
{
public int pocetKladiv = 0;
public int pocetSroubovaku = 0;
public int pocetHasaku = 0;
public bool JePrazdna()
{
return (pocetKladiv==0 && pocetSroubovaku==0 && pocetHasaku==0);
}
}
class BednaSOvocem
{
public int pocetKusu = 0;
public DateTime spotrebovatDo;
public string druhOvoce = "?";
public bool JePrazdna()
{
return (pocetKusu == 0);
}
}
a ty bedny pak můžeš použít, tak že jim dáš nějaké názvy:
BednaSVercajkem KarlovaBedna = new BednaSVercajkem() , VojtovaBedna = new BednaSVercajkem();
BednaSOvocem bednaHrusek = new BednaSOvocem(), bednaJablek = new BednaSOvocem();
A instance1, instance2; A instance3;
> mělo tam bejt i "A instance 2" ?
class si můžeš představit jako obecnou bednu, kterou musíš "otypovat", tedy určit jaké bude mít možnosti
> No právě, takže jde jen o zažitý pojem. Já si to tak myslel, ale raděj jsem se zeptal, protože pod pojmem "typ" si představím právě "int, bool, double apod"
#37 safranek
> mělo tam bejt i "A instance 2" ?
Nemusí, je to na začátku dokud se tam nedá středník, ale čárka tak to furt platí. Ale tohle jsi si mohl ověřit ve visualstudiu.
> .."typ" si představím právě "int, bool, double apod"..
V podstatě máš pravdu on to není hodnotový typ jako int apd. Jde o uživatelsky definovaný referenční typ. Přesné názvosloví není pro mě podstatné, nikdy jsem se ho neučit. Tady je o tom nějaké povídání, možná je tam taky pro tebe něco pro pochopení.
>Tohle je taky samo o sobě konstruktor?
ne, to je statická metoda (funkce), která se spouští vždy po startu programu
Jinak, doufám že sem ten autorův "vláček" (nechci psát řetězec, protože to v programování taky něco znamená) pochopil správně - https://files.fm/…syh7vrp - takže je to vlastně celé "jen na ukázku", protože pokud tam vždy napíše "this.cislo = cislo;", tak vlastně řekne "vem hodnotu se kterou jsi přišel, a zase ji vrať zpátky".
Jen nerozumim, proč program ignoruje hodnoty v prvním konstruktoru. Ano, true je pořád true, i na začátku programu (mluvím o řádku 7) ale v prvním konstruktoru (řádek 24) je "natvrdo" napsáno "cislo = 100;" Proč program ignoruje tyto "natvrdo" hodnoty? Když totiž autor videa nechá proběhnout program, zobrazí se mu, že číslo je "50", nikoliv "100". https://files.fm/u/c2c7xxap4
Pozor při inicializaci proměnných:
int a, b = 2; //inicializuje jen b, b=2
Proto píšu každou proměnnou na samostný řádek. Navíc pak ke každé proměnné můžu napsat "její vlastní" komentář. Málokdy je to v praxi tak jednoduché jako
float a, b, c; //strany trjuhelniku
hu
Z #40 usuzuji, že konstruktor nastaví instanci na 100 a pak volání metody to změní na 50.
hu
#42 safranek
samozřejmě jde jen o ukázky, aby bylo poznat, že se hodnota změnila
reálnější je tento příklad:
class C
{
uint tag = 0;
string title;
public C()
{
title=string.Empty; //doplní prázdný řetězec, aby title nebylo null
}
public C(int Tag)
: this() //spustí konstruktor bez parametru
{
tag=Tag;
}
}
Aby to nebylo tak abstraktní, něco ze života. Určitě jsi zaregistroval reklamu, že banka ti dá 1000,-Kč na vyzkoušení účtu, když si ho založíš. Při zakládání účtu banka provede "parametrický konstruktor":
Ucet jmeno_uctu = new Ucet(1000);
Nyní máš svůj nový účet a je na něm 1000,-Kč. První transakce, která proběhne, je připsání výplaty od tvého zaměstnavatele, banka provede "metodu", která k zůstatku účtu přičte příchozí platbu:
decimal vyplata = 20000; //z dat banky tveho zamestnavatele se tvoje banka dozvedela, kolik pripsat
jmeno_uctu.Prichozi(vyplata);
a na účtu už není 1000,-Kč, je tam 21000,-Kč.
Druhý příklad: ráno vstaneš s úsměvem. pak mne potkáš a já ti řeknu nějakou hrubou urážku. Během chvilky budeš nasranej a místo pozdravu mi rozbiješ hubu.
V obou případech se stav instance vlivem "volání metody" a "vnitřní logiky" změnil. Jak je vidět, virtuální svět má mnoho společného s reálným světem.
hu
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Object reference not set to an instance of an object. — založil whysper
Object to string — založil Anonymní uživatel
Problem in Object — založil neimenuje
Třída object v c++ — založil Porcepoque
Object slides — založil AccOuNTi
Moderátoři diskuze