C#:액세스하는 사전을 사용하여 부분적인 클래스

0

질문

나에 액세스하려고 사전에서는 다음과 같은 방법을 사용하여 부분적인 클래스입니다. 최종 목적의 이면에 노출이 사전에 허용하는 다른 방법을 직접 읽기/쓰기/니다.

FilenameABC.cs 은 이 코드는 것으로 보인다 확인을 위해 내게 지금까지:

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

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

FilenameDEF.cs 이 코드는 곳이 나는 데 어려움이 있습니다. 나는 확실하지 않다는 이유 .추가 방법을 작동하지 않습니다. 에서 첫 번째는 나는 사용하려고 그 후의 인스턴스를 만들 ExampleDictionary 클래스는 것 같다 꽤 다운(주어 현재 수준의 지식,of course). 에서 두 번째,내가 노력하고 추가 요소 내부에서는 방법

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              
            }          
        }
    }
}

할 수 있는 사람을 지원하십시오?

2
1

Static 방법 FunctionA 액세스할 수 없습니다 인스턴스가 구성원의 ClassA.

을 변경하거나 FunctionA 비 정전 또는 사전 필드는 정적이다.

2021-11-22 16:28:57
1

나는 여전히 말할 수가 없습 무엇을하려고 노력하고 있습니다. 하지만 내가하기 위해 최선을 다하겠 쇼 당신이 어떤 물건입니다.

나는 이 문장 당신이 쓴: "최종 목적의 이면에 노출이 사전에 허용하는 다른 방법을 직접 읽기/쓰기/니다." 으로 가이드

부분적인 수준의 문제

제가 언급했듯이에서 같은 것은 없으로 부분적인 클래스입니다. Partial 키워드 간단히 나타내는 클래스에서 정의할 수 있습니다 더 이상 하나 파일입니다. 정의에 대한 규칙 클래스를 동일하게 유지,그것은 단지 어떤 클래스의 구성원에서 정의할 수 있습니다 하나의 파일로 다른 부분에서 다른 파일이 있습니다.

문제 당신은 여기에는 아무 것도 할 수 partial 키워드입니다.

당신의 두 //이 작동하지 않 노트

첫 번째 중 하나는 다음과 같습니다:

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

첫 번째 라인을 선언하고 개인원 분야 ClassA 이름 instanceOfDict 초기화합니다. 그 이유는 그것을 컴파일.

두 번째 라인을 넣어하려고 실행 가능한 코드(함수 호출)바로 위에 있는 수준 범위의 클래스입니다. 당신은 할 수 없습니다. 할 수 있습을 넣어 무리의 일에서 최고 수준의 범위는 클래스(예:필드,속성,방법,대리인,열거형,내부 클래스),하지만 당신은 수 있지 코드가 있다.

당신의 두 번째 문제는 다음과 같습니다:

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              
    }          
}

은 기능성 세라믹 재료 static 방법입니다. instanceOfDict 개인 분야의 클래스로 선언되지 않은 고정되어 있습니다. 당신을 참조 할 수 없습니다 인스턴스를 인스턴스의 수준 구성원(방법,특성,...)에서 정적 방법입니다. 에 읽 static 키워드입니다.

을 만드는 클래스를 선택적으로 노출에는 사전

이후 할 일부 사업 내부에는 클래스,그러나 노출,외부에 갔을 전체 돼지고 만들어 내는 클래스 일반에 대 <TKey, TValue> 그래서 작동하는 것으로 사전의 어떤 유형입니다.

나 또한 그것을 구현하는 컬렉션을 초기화 패턴 할 수 있도록 초기화 클래스의 인스턴스처럼 그는 강력한 소프트웨어입니다.

을 사용하여 컬렉션을 초기화 패턴,반해야 할 것이다:

  1. 구현 IEnumerableIEnumerable<T> (T 될 수 있는 모든 유형 단지 입력할 수집할 수 있습을 던질 NotImplementedException 는 경우 걱정하지 않)

  2. 는 방법을 포함처럼 보이는 public void Add (SomeType atLeastOneParameter). 할 수 있는 하나 이상의 오버로드 Add 당신이 원하는 경우.

그래서,저는 이것으로 시작(주의를 구현하는 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();
    }
}

는 충분한 클래스를 만들려면 대부분처럼 보이 사전에(아마 추가하려는 어떤 방법으로 데이터를 얻을 수있는,등등. 하지만,당신은(당신은 아마이 있고 싶 indexer(에 TKey고) TryGetValue.

지만,일 이상의 기능을하는 클래스(이에서 최고 수준의 범위):

    public int Count => _theDictionary.Count;

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

는 것을 볼 수 있는 방법을 많은 일들이 사전에 당신 항목을 반복하(의 KeyValuePairs는)사전 컬렉션이 있습니다. 추가하여 주시기 바랍니다.

마지막으로,이를 테스트하...

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);
    }
}

을 실행할 때 이 코드 얻을:

TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred

분를 사용하여 이 부분

왜 당신이 사용하고 싶 partial class. 일반적으로 이행하는 두 개의 덩어리 코드가 있는 편집/에 의해 유지되는 다른 사람들(전형적인 이유는 Visual Studio 의 템플릿 생성/wizarding 메커니즘을 유지하는 한쪽의 partial class 고 프로그래머이다.

이 규칙은 아주 간단합니다,당신은 단순히 선언 public partial class MyClass 에서 두 개의 파일이 있습니다. 두 파일에 있어야 합니다 동일한 프로젝트(즉,컴파일로는 같은 어셈블리)와 클래스에서는 네임스페이스가 있습니다. 이렇게 하면 그냥을 분할(최고 수준의 범위)비트와 조각에서 두 개의 partial class 선언이 있습니다.

이 경우 나는 아마 그것을 나누는 이 방법:

  • 나 한 쪽을,나를 넣어 두 가지 기능을 구현하는데 필요한 선언 IEnumerator<TValue>:
    • public IEnumerator<TValue> GetEnumerator()
    • IEnumerator IEnumerable.GetEnumerator()
  • 중 하나는,다른 측면을 넣는 것이 좋 다른 모든 것:
    • 사전 선언 intialization
    • 의 기타 열거자: public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    • public int Count => _theDictionary.Count;
    • public void Add(TKey key, TValue value)
2021-11-23 01:45:02

나는 표현할 수 없습하니 얼마나 감사한지 모르겠다. 이것은 또한 도움이 나누고 몇 가지 오해했다. 때로는 프로그래밍을 배우져옵니다 하지만 실망하지만,인터넷 이용이 가능이 있다는 놀라운 당신 같은 사람들이,헌신하는 조각에 하루의 다른 사람을 도울 것입니다. 다시 한번 감사드립니다!
roccaforte

예,저도 그렇게 생각해요. 다행히,나는 단지 이것을 달성 배지를 수 있는 신인으로 거래를 시작하려면 이러한 환습니다. :-)
roccaforte

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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