C#: prístup k Slovníku pomocou čiastočného triedy

0

Otázka

Snažím sa prístup Slovník nasledujúcim spôsobom, pomocou čiastočného triedy. Koniec účely tohto je vysvetliť tento slovník a umožňujú rôzne spôsoby priamo na čítanie a zápis z/do neho.

FilenameABC.cs má tento kód, ktorý sa zdá byť OK pre mňa tak ďaleko:

namespace Namespace1
{
    partial class ClassA
    {
        public class ExampleDictionary
        {
            private Dictionary<int, string> _dict;

            public ExampleDictionary()
            {
                _dict = new Dictionary<int, string>();
            }
        }
    }
}

FilenameDEF.cs má tento kód a je to tam, kde som s ťažkosťami. Nie som si istý prečo .Pridať metódy nefungujú. V prvom z nich som sa snažia používať len po vytvorení inštancie ExampleDictionary triedy, čo sa zdá byť pomerne počítadlo intuitívne (vzhľadom k mojej súčasnej úrovni poznatkov, samozrejme). V druhom sa snažím pridať ďalšie prvky, z vnútra metódu, ktorá je

namespace Namespace1
{
    partial class ClassA
    {
        ExampleDictionary instanceOfDict = new ExampleDictionary();
        instanceOfDict.Add(1, "Test1"); // This does not work

        public static void FunctionA()
        {            
            for (int i = 0; i < 10; i++)
            {
            string text = $"Test{i}";
            instanceOfDict.Add(i, text); // This does not work as well              
            }          
        }
    }
}

Mohol by niekto pomôcť, prosím?

2
1

Statická metóda FunctionA nemôže získať prístup stupňa členov ClassA.

Buď zmeniť FunctionA ak chcete byť non-statické alebo aby slovník pole statické.

2021-11-22 16:28:57
1

Stále nemôžem celkom povedať, čo sa snažíte urobiť. Ale budem robiť moje najlepšie, ktoré vám ukázať niektoré veci.

Beriem to veta, ktorú napísal: "koniec účely tohto je vysvetliť tento slovník a umožňujú rôzne spôsoby priamo na čítanie a zápis z/na to." ako môj sprievodca

Čiastočné Triedy Problémy,

Ako som už spomenul v komentároch: nie je tam žiadna taká vec ako Čiastočné Triedy. Čiastočné kľúčové slovo jednoducho znamená, že trieda môže byť definované vo viac ako jeden súbor. Definícia pravidiel pre triedu zostávajú rovnaké, je to len, že niektoré triedy členovia môžu byť definované v jednom súbore a ostatné diely v ďalších súborov.

Problémy sú s tu mať nič do činenia s partial kľúčové slovo.

Vaše Dve // Toto nefunguje Poznámky

Prvý z nich vyzerá takto:

partial class ClassA
{
    ExampleDictionary instanceOfDict = new ExampleDictionary();
    instanceOfDict.Add(1, "Test1"); // This does not work
    //other code
}

Prvý riadok vyhlasuje, súkromné členských oblasti ClassA s názvom instanceOfDict a inicializuje ju. To je dôvod, prečo zostavuje.

Druhý riadok sa snaží dať runnable kód (volanie funkcie) priamo v top-level rozsahu triedy. Môžete to urobiť, že. Môžete dať veľa vecí na najvyššej úrovni v rámci triedy (napr., pole, vlastnosti, metódy, delegátov, výpočty, vnútorné triedy), ale nemôžeš dať kód tam.

Vaša druhá otázka vyzerá takto:

public static void FunctionA()
{            
    for (int i = 0; i < 10; i++)
    {
        string text = $"Test{i}";
        instanceOfDict.Add(i, text); // This does not work as well              
    }          
}

Barcelony je static metódy. instanceOfDict je súkromná oblasti triedy, ktoré nie sú vyhlásené za ako statické. Nemôžete odkazovať na stupni stupni-na úrovni členov (metódy, vlastnosti, polia, ...) zo statickej metódy. Prečítajte si na static kľúčové slovo.

Vytvorenie Triedy, ktoré Selektívne Vystavuje Slovník

Pretože ste chceli robiť niektoré slovník práci vo vnútri triedy, ale vystaviť ho von, išiel som celé prasa, a urobil môj triedy generic na <TKey, TValue> tak, že to funguje so Slovníkmi akéhokoľvek druhu.

Tiež som robil to realizovať Zber Inicializácia Vzor , takže môžete spúšťať inštancie triedy rovnako ako to bolo slovník.

Ak chcete použiť Zber Inicializácia Vzor, vaša trieda musí urobiť, aby sa veci:

  1. Realizovať IEnumerable alebo IEnumerable<T> (T môže byť akýkoľvek typ, nie len typ ste zber - môžete dokonca len hodiť NotImplementedException ak sa nechcete starať)

  2. Patrí metóda, ktorá vyzerá ako public void Add (SomeType atLeastOneParameter). Môžete mať viac ako jeden preťaženiu Add ak budete chcieť.

Takže, začnem s týmto (Všimnite si, že to náradie IEnumerable<T>:

public partial class TestExposedDictionary<TKey, TValue> : IEnumerable<TValue>
{
    private readonly Dictionary<TKey, TValue> _theDictionary = new Dictionary<TKey, TValue>();

    public void Add(TKey key, TValue value)
    {
        _theDictionary.Add(key, value);
    }

    public IEnumerator<TValue> GetEnumerator()
    {
        foreach (var kvp in _theDictionary)
        {
            yield return kvp.Value;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

To je dosť, aby sa trieda väčšinou vyzerajú ako slovník (si asi chcete pridať nejaký spôsob, ako získať dáta, atď. Ale, to je len na vás (pravdepodobne chcieť mať indexer (na TKey) a TryGetValue.

Ale, poďme pridať niektoré ďalšie náhodné funkcie triedy (daj to na najvyššej úrovni v rozsahu triedy):

    public int Count => _theDictionary.Count;

    public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    {
        foreach (var kvp in _theDictionary)
        {
            yield return kvp;
        }
    }

Ktoré vám umožní vidieť, ako veľa vecí, ktoré sú vo vašom slovníku a umožní iterovať cez položky (v KeyValuePairs), že Slovník zbierok. Neváhajte pridať ďalšie funkcie.

Nakoniec, tento test...

public static void Test()
{
    var testDict = new TestExposedDictionary<int, string> {
        {1, "one" },
        {5, "five" },
        {8, "eight" },
        {10, "ten" },
        {105, "hundredFive" },
    };

    // I can call Add in the normal way as well:
    testDict.Add(300, "threeHundred");

    Console.WriteLine($"TestDict Count: {testDict.Count}");
    foreach (string s in testDict)
    {
        Console.WriteLine(s);
    }
}

Keď som sa spustiť tento kód, som si:

TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred

Rozdelenie to pomocou Čiastočné

Neviem, prečo chcete použiť partial class. Zvyčajne je to vykonané dva kusy kódu, ktoré sú upravené/udržiavaný rôznych personas (typický dôvodu je pre Visual Studio templating/čarodejníckom mechanizmus na udržanie jednej strane partial class a programátor ostatných.

Pravidlá sú celkom jednoduché, stačí vyhlásiť public partial class MyClass v dvoch súborov. Dva súbory musia byť v rovnakom projektu (t. j. modul do rovnakej Montáž) a triedy musí byť v rovnakej názvov. Akonáhle to urobíte, len split (top-level rozsahu) kúsky cez dvoch partial class vyhlásenia.

V tejto prípadoch, asi by som ich rozdeliť takto:

  • Jedna z jednej strany, ja by som dal dve funkcie potrebné na vykonanie vyhlásený IEnumerator<TValue>:
    • public IEnumerator<TValue> GetEnumerator()
    • IEnumerator IEnumerable.GetEnumerator()
  • Na druhej strane, ja by som dal všetko ostatné:
    • Slovník vyhlásenie a intialization
    • Ostatné stiahnuť: public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    • public int Count => _theDictionary.Count;
    • public void Add(TKey key, TValue value)
2021-11-23 01:45:02

Nemôžem sa vyjadriť, ako vďačný som za to. To mi tiež pomohol rozbiť niekoľko mylných predstáv som mal. Niekedy naučiť programovanie dostane, ale frustrujúce, ale luckly tam sú úžasné jednotlivcov, ako ste vy, ktorý venoval kus svojho deň na pomoc druhých. Ešte raz vďaka!
roccaforte

Áno, mám. Našťastie, práve som dosiahol tento odznak, ktorý umožňuje mňa ako nováčika na začiatku obchodovania tejto meny. :-)
roccaforte

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................