C# - klíčové slovo static a řízení přístupů k proměnným – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# - klíčové slovo static a řízení přístupů k proměnným – .NET – Fórum – Programujte.comC# - klíčové slovo static a řízení přístupů k proměnným – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Doomista+1
Stálý člen
12. 4. 2015   #1
-
0
-

Zdravím, dal jsem se na vývoj WP aplikací a dost se peru s pro mě novým C#. Mám nějaký takový kód:

namespace IngressClone {
	public partial class MainPage : PhoneApplicationPage {
	struct PortalData{
		int id;
		//...
		void setupId(int nid){
		id = nid;
		}
	};
	//...
	const string NICK = "doomista";
	//...
	double UserLat=74.0064, UserLon=40.7142;
	static PortalData portalInfo;

		/* CONSTRUCTOR */
		public MainPage() {
		InitializeComponent();
		//...
		}

		public static void ProcessPortalInfo(string[] data){
		portalInfo.fillData(data[0],data[1],Int32.Parse(data[2]),Int32.Parse(data[3]));
		}

		private static void DownloadPortalInfoCallback(Object sender, DownloadStringCompletedEventArgs e){
		string down = e.Result.ToString();
		ProcessPortalInfo(down.Split(' '));
		}

		public static void DownloadPortalInfo(Uri url){
		WebClient client = new WebClient();
		client.DownloadStringCompleted += new DownloadStringCompletedEventHandler (DownloadPortalInfoCallback);
		client.DownloadStringAsync (url);
		}

		private void Button_UpdateLocation(object sender, RoutedEventArgs e) {
		/* Get Location */
		GeoCoordinateWatcher gwatcher = new GeoCoordinateWatcher();
		var PositionNow = gwatcher.Position;
			if (!PositionNow.Location.IsUnknown){
			UserLat = PositionNow.Location.Latitude;
			UserLon = PositionNow.Location.Longitude;
			}
		//...
		//volání stahování
		//...
		portalName.Text = portalNames[ptr];	// změna TextBlocku aplikace
		}
	}
}

Funkce Button_UpdateLocation je volána aplikací, když stisknu tlačítko. Tahle funkce má přístup ke všem assetům aplikace, takže zde můžu měnit třeba nápisy v TextBoxech. Zároveň mám přístup ke všem konstantám i proměnným definovaným v ukázce. Jedinou výjimkou jsou proměnné uvnitř objektu struktury, k těm se dostanu leda tak, že si napíšu metodu struktury, která s nimi bude manipulovat. Nechápu, proč mě to nutí dělat takovou zbytečnost, kdybych tohle chtěl, tak si udělám class, ale proteď ten problém neřeším, jakkoli je na stránkách m$ avizované, že struktury mají fungovat jako custom datové typy.
Opravdový problém nastává, když si chci stáhnout zdrojový kód webové stránky a použít ho v aplikaci pro změnu textboxů a uložení ve struktuře.
Podle dokumentace microsoftu jsem dal dohromady jakýs takýs kód včetně callbacku, s nímž jsem doposud nikdy nepracoval, ale chápu, k čemu je. Morální problém mám se slůvkem static, které pro mě v praxi znamená, že funkce ztrácí přístup k assetům aplikace a ke všem proměnným, které nejsou deklarovány jako static. Paradoxně k non-static konstantám (za předpokladu, že const není nějakým způsobem podmnožinou static) přístup mám stále. Ze stejného důvodu ale z této funkce nemůžu ani volat žádnou non-static funkci, která by k těmto prvkům přístup měla.
Může mi tohle prosím někdo vysvětlit a poradit, jak si s tím poradit? Hatmatilku na m$ stránkách totiž fakt nepobírám. Díky moc předem

Nahlásit jako SPAM
IP: 109.80.171.–
Na vše stačí iostream...
ingiraxo+15
Grafoman
12. 4. 2015   #2
-
0
-

Já mám dojem, že nechápeš k čemu static je... situace, kdy řešíš problém s přístupy mezi static a non-static znamená, že děláš něco špatně

Rozhodně by si neměl dělat všechno static a použití konstant mimo třídu mi přijde zvrhlý, konstanta neni definice jako v C

Takže rada... zruš všechno static, vytvoř třídu na konstanty, nedělej nic globálně, a pro tvůj problém s přístupy mezi static a non-static použij pattern singleton

a jen tak ke static... statická promenná se pevně svázaná s objektem, to znamená, že můžeš vytvořit X instancí objektu a ta proměnná bude vždy stejná (je sdílená mezi objekty stejného typu) a logicky nemůže přistupovat k ne-statickým (instančním) proměnným

k tomu struct... struktůra je nižlí level třídy a na rozdíl od třídy nikdy neni prázná, tzn. že nemůže být null.. spouží primárně pro DTO (data transfer object)... hojně se používá třeba v delegování, callbacky, události nebo prostě, když potřebuješ získat více informací z metody... zde existuje jednoduché pravidlo, pokud začíná mít strukůra více metod než get/set/property, tak použij class

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Matěj Andrle+1
Grafoman
12. 4. 2015   #3
-
0
-

#1 Doomista
OOP...

Nahlásit jako SPAM
IP: 78.136.171.–
Doomista+1
Stálý člen
12. 4. 2015   #4
-
0
-

#2 ingiraxo
koukám, že začátky v C# budou opravdu krušné po tom, na co jsem si zvykl v C++.
Rád bych se zbavil všeho static, ale vzhledem k tomu, že delegát callbacku static být musí, tak se ptám, jak z něj mám dostat ten výsledek. Doufal jsem, že než se to naučím, tak nebude vadit, když všechno budu lifrovat do jedné třídy. K čemu jsou všechny ty get, set metody se budu muset taky někde podívat, ale znamená to v praxi, že přímý přístup k členským položkám objektu struktury opravdu nedostanu?

Nahlásit jako SPAM
IP: 109.80.171.–
Na vše stačí iostream...
Řešení
ingiraxo+15
Grafoman
12. 4. 2015   #5
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#4 Doomista
rozhodně je lepší situace, když přecházíš z C++ na C#/javu než obráceně, protože to je kolikrát katastrofa

delegát (ukazatel na funkci) v callbacku být static rozhodně nemusí.. předem doporučuju se vyhnout všemu static, vždy to jde bez něj.. static se používá zřídka a když je skutečně potřeba

k položkám (fieldům) se dostaneš, nebo teď asi nechápu jak to myslíš

Ukázka: 

public class Program
{
    // definice delegátu
    private delegate void Callback(string msg);

    // metoda, kterou volám
    private void Write(string msg, Callback clb)
    {
        clb(msg);
        Console.WriteLine(msg);
    }

    // metoda volaná delegátem
    private void CallbackListener(string msg)
    {
        Console.WriteLine("Listener: " + msg);
    }

    // MAIN
    public static void Main(string[] args)
    {
        Program p = new Program();
        p.Write("Hi", p.CallbackListener);
    }
}

Druhá ukázka při použití události na callback 

public struct UserArgs
{
    public string Name { get; set; }

    public byte Age { get; set; }
}

public class Program
{
    private delegate void Callback(UserArgs user);

    private event Callback OnLoad = delegate { };

    private void Load()
    {
        UserArgs a = default(UserArgs);
        a.Name = "Karel";
        a.Age = 60;
        OnLoad(a);
    }

    public static void Main(string[] args)
    {
        Program p = new Program();
        p.OnLoad += user =>
        {
            Console.WriteLine(string.Format("User {0} was loaded!", user.Name));
        };
        p.Load();
    }
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Doomista+1
Stálý člen
12. 4. 2015   #6
-
0
-

#5 ingiraxo
delegát (ukazatel na funkci) v callbacku být static rozhodně nemusí..

jo díky, tohle mě před chvilkou nakonec napadlo i samotnýho. při opisování z netu se mi zamotalo static už do funkce vyvolávající callback a já pak na ni úplně zapomněl. problém vyřešen, díky moc

s těmi strukturami už jsem to taky rozlousknul. předpokládal jsem, že defaultní chování struktury je stejné, jako v C++, tedy že její položky jsou defaultně public, ale dostal jsem k nim přístup až teď, když jsem je explicitně deklaroval jako public

struct MyStruct{
	int id;
};
MyStruct struct;
struct.id = 10; // NEJDE

struct MyStruct{
	public int id;
};
struct.id = 10;	// JDE
Nahlásit jako SPAM
IP: 109.80.171.–
Na vše stačí iostream...
m4r100
Návštěvník
12. 4. 2015   #7
-
0
-

#6 Doomista
V C# jsou clenove tridy/struktury implicitne private. A samotne tridy/struktury jsou internal. V interface je vsechno public. Doporucuje se vzdycky manualne specifikovat modifikatory pristupu (s vyjimkou interface, kde to nema smysl a ani nejde).

A pozor na vnorene tridy/structury tam je chovani taky trochu jine. Existuje malo situaci kdy se je vyplati delat.

Nahlásit jako SPAM
IP: 94.112.138.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý