Hirdetés

Aktív témák

  • pmonitor

    aktív tag

    A C# topikban volt 2 kijelentés, ami arra ösztönzött, hogy írjak 1 példa kódot. Ezek a kijelentések. Az egyik:
    c#-ban mindennek van egy közös szülőtípusa, úgy hívják object

    A másik:
    Igen. Foreachel, de igazából, while, for, tökmindegy mivel gyűjteményeken iterálsz végig, nem típuson.

    A következő kódban egyértelműen látszik, hogy mi a fő különbség a class és a struct között.
    Mint ahogy az is látható, hogy a foreach megvalósítható while() és for() ciklussal is, de:
    1: Nem erre találták ki ezeket, hogy 1 user programozó így használja ezeket, amikor ott van a foreach(). A foreach direkt erre készült.
    2: A while() használata esetén igazából 3 utasítás az, amit a foreach() 1 utasítással megold.
    3: A foreach használata biztonságosabb, mint a while(). Lásd a példakódban azt a sort, aminek a végén a "//BUMMM!!!" megjegyzés van.

    using System;
    using System.Collections.Generic;

    namespace Teszt
    {

    class TesztOsztaly
    {
    public int X { get; set; }
    public TesztOsztaly(int x)
    {
    X = x;
    }
    }

    struct TesztStruct
    {
    public int X;
    public TesztStruct(int x)
    {
    X = x;
    }
    }

    internal class Program
    {
    static void Main(string[] args)
    {
    List<TesztOsztaly> tesztosztalyok = new List<TesztOsztaly>();
    tesztosztalyok.Add(new TesztOsztaly(1));
    tesztosztalyok.Add(new TesztOsztaly(2));
    tesztosztalyok.Add(new TesztOsztaly(3));
    foreach (TesztOsztaly item in tesztosztalyok)
    {
    //if (item.X == 2) item = new TesztOsztaly(6); //Invalid!!!
    //if (item.X == 2) tesztosztalyok.Remove(item); //Invalid!!!
    //tesztosztalyok[1] = new TesztOsztaly(5); //Invalid!!!
    item.X = 11;
    }
    for (int i = tesztosztalyok.Count - 1; i >= 0; --i)
    {
    if (tesztosztalyok[i].X == 1) tesztosztalyok.RemoveAt(i); //Valid!!!
    if (tesztosztalyok[i].X == 2) tesztosztalyok[i] = new TesztOsztaly(6); //Valid!!!
    if (tesztosztalyok[i].X == 6) tesztosztalyok[i] = new TesztOsztaly(8); //Valid!!!
    }
    HashSet<TesztOsztaly> htesztosztalyok = new HashSet<TesztOsztaly>();
    htesztosztalyok.Add(new TesztOsztaly(1));
    htesztosztalyok.Add(new TesztOsztaly(2));
    htesztosztalyok.Add(new TesztOsztaly(3));
    htesztosztalyok.Add(new TesztOsztaly(4));
    HashSet<TesztOsztaly>.Enumerator enumerator = htesztosztalyok.GetEnumerator();
    while (enumerator.MoveNext())
    {
    TesztOsztaly item = enumerator.Current;
    //if (item.X == 3) htesztosztalyok.Remove(item); //Invalid!!!
    item.X = 11;
    item = new TesztOsztaly(3); //BUMMM!!!
    }
    Console.WriteLine("htesztosztalyok:");
    foreach (TesztOsztaly item in htesztosztalyok)
    {
    Console.WriteLine(item.X);
    }
    Console.WriteLine("");
    foreach (TesztOsztaly item in htesztosztalyok)
    {
    item.X = 12;
    }
    foreach (TesztOsztaly item in htesztosztalyok)
    {
    Console.WriteLine(item.X);
    }
    Console.WriteLine("tesztstructlist:");
    List<TesztStruct> tesztstructlist = new List<TesztStruct>();
    tesztstructlist.Add(new TesztStruct(1));
    tesztstructlist.Add(new TesztStruct(2));
    tesztstructlist.Add(new TesztStruct(3));
    tesztstructlist.Add(new TesztStruct(4));
    foreach (TesztStruct item in tesztstructlist)
    {
    //item.X = 11; //Invalid!!!
    }
    List<TesztStruct>.Enumerator enumeratorstruct = tesztstructlist.GetEnumerator();
    while (enumeratorstruct.MoveNext())
    {
    TesztStruct item = enumeratorstruct.Current;
    Console.WriteLine(item.X);
    }
    Console.ReadKey(true);
    }
    }
    }

    Aki ezt a kódot megérti, hogy mi miért úgy történik ahogy, akkor ő megértette a lényeget. És nem ír olyanokat, hogy tökmind1, hogy foreach(), for(), vagy while().

Aktív témák