ฉันยังไม่สามารถค่อนข้างบอกอะไรคุณกำลังพยายามจะทำ แต่ฉันจะทำดีที่สุดเพื่อให้คุณดูบางอย่างอยู่
ผมกำลังลงเรียนนี่ที่ตัดสินให้ประหารชีวิตคุณเขียน: "จุดจบโดยมีจุดประสงค์เพื่อนี่จะเปิดเผยเรื่องนี้พจนานุกรมและอนุญาตให้แตกต่างวิธีการโดยตรงอ่าน/เขียนอกจาก/เพื่อน" เป็นของฉันนำทาง
บางส่วนชั้นเรียนปัญหา
ที่ฉันพูดถึงอยู่ในความคิดเห็นที่ไหนไม่มีสิ่งที่เรียกว่าเป็นแค่ส่วนนึงของชั้นเรียน คนบางส่วนคำค้นเพียงชี้ให้เห็นว่านั่นเป็นชั้นเรียนอาจจะเป็นกำหนดไว้ในมากกว่าหนึ่งแฟ้ม ที่นิยามกฎสำหรับชั้นเรียนอยู่คนเดียวกันมันเป็นแค่บางอย่างของชั้นสมาชิกอาจจะกำหนดไว้ในแฟ้มและส่วนอื่นๆในแฟ้มอื่น.
ที่ปัญหาเรื่องคุณจะมีที่นี่มี อะไร ต้องทำยังไงกับ partial
คำค้น.
คุณสองคน //มันไม่ทำงาน บันทึกย่อ
คนแรกดูเหมือนนี้:
partial class ClassA
{
ExampleDictionary instanceOfDict = new ExampleDictionary();
instanceOfDict.Add(1, "Test1"); // This does not work
//other code
}
ที่แรกบนเส้นประกาศให้แบงค์ที่พิมพ์คำว่าส่วนตัวสมาชิกสนาม ClassA
ชื่อ instanceOfDict
และ initializes มัน นั่นคือเหตุผลว่าทำไมมัน compiles.
ที่สองเส้นตามที่พยายามทำให้ runnable รหัส(เป็นเรียกฟังก์ชัน)โดยตรงในระดับบนขอบเขตของชั้นเรียน คุณไม่สามารถทำอย่างนั้น คุณสามารถทำให้กลุ่มของเรื่องที่ระดับบนสุดขอบเขตของชั้นเรียน(e.g.,ช่องข้อมูล,คุณสมบัติ,วิธีการของ,delegates,enums,ตนภายในชั้นเรียน)แต่คุณไม่สามารถให้รหัสนั้น
คุณสองปัญหาดูเหมือนนี้:
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
}
}
FunctionA เป็น static
วิธีการ. instanceOfDict
เป็นส่วนตัวสนามของชั้นเรียนไม่ประกาศเป็นคงทน คุณไม่สามารถเรียกตัวอย่างเพื่อตัวอย่าง-ระดับสมาชิก(วิธีการของ,คุณสมบัติช่องข้อมูล,...)จากรูปแบบวิธีการ. อ่านบน static
คำค้น.
สร้างชั้นเรียนนั่น Selectively เปิดโปงเป็นพจนานุกรม
ตั้งแต่คุณต้องการจะทำบางอย่างพจนานุกรมทำงานในห้องแต่เปิดเผยมันให้ออกมาข้างนอกแล้วฉันไปทั้งแย่และทำให้ชั้นเรียนของผมอยู่ทั่วไป <TKey, TValue>
ดังนั้นมันทำงานกับพจนานุกรมของประเภทนี้ได้นะ
ฉันยังทำมันด้วยอะไรซักอย่าง ชุดสะสม Initialization รูปแบบ ดังนั้นคุณสามารถเริ่มการใช้งานโหของคุณเรียนก็เหมือนกับว่ามันเป็นพจนานุกรมแล้ว
ต้องใช้ชุดสะสม Initialization รูปแบบของคุณชั้นเรียนต้องทำอย่าง:
ด้วยอะไรซักอย่า IEnumerable
หรือ IEnumerable<T>
(T
จะมีประเภทไม่ใช่คนประเภทที่คุณรวบรวม-คุณสามารถพึ่งขว้าง NotImplementedException
ถ้าคุณไม่สนใจ)
รวมถึงวิธีการนั้นดูเหมือนว่า public void Add (SomeType atLeastOneParameter)
. คุณสามารถมีมากกว่าหนึ่งของโอเวอร์โหลด Add
ถ้าคุณต้องการ
ดังนั้นผมเริ่มกับเรื่องนี้(โปรดสังเกตว่ามัน implements 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();
}
}
นั่นมันมากพอที่จะทำให้เป็นห้องส่วนใหญ่ก็ดูเหมือนพจนานุกรม(ของคุณอาจจะต้องการเพิ่มซักทางเพื่อเอาข้อมูลเป็นต้น แต่นั่นขึ้นอยู่กับคุณ(คุณอาจจะอยากได้ตัวสร้างดัชนี(บ TKey
และเป็น TryGetValue
.
แต่มาเพิ่มอีกหน่อแบบสุ่ม functionality ไปที่ชั้นเรียน(ให้อยู่ที่ระดับบนสุดขอบเขตของคลาส):
public int Count => _theDictionary.Count;
public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
{
foreach (var kvp in _theDictionary)
{
yield return kvp;
}
}
ที่จะอนุญาตให้คุณเห็นว่าหลายสิ่งที่อยู่ในพจนานุกรมของคุณและอนุญาตให้คุณ iterate นือรายการ(คน 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
. ปกติแล้วนี่คือทำให้มีสองท่อนของรหัสนั่นเป็นจ/คอยดูแลเรื่อยต่างกัน personas(รความช่วยเหลือจากเหตุผลสำหรับราสตูดิโอขอ templating/wizarding กลไกของมันจะรักษาด้านนึงของคน partial class
และที่โปรแกรมเมอร์อีกคนไป
กฏมันค่อนข้างง่ายคุณเพียงประกาศ public partial class MyClass
ในอีกสองแฟ้ม สองคนแฟ้มที่ต้องเป็นแบบเดียวกับโครงการ(i.e.,รวบรวมข้อมูลเสร็ไปที่เดียวกับ โรงเรี)และเรียนต้องเป็นแบบเดียวกับย้ายไปยัง. เมื่อคุณทำอย่างนั้นก็แบ่ง(ระดับบนขอบเขต)ชิ้นต่อชิ้นข้ามสองคน partial class
declarations.
ในนี้คดีเป็นฉันจะแยกออกแบบนี้
- อีกด้านนึงผมจะให้สองคนฟังก์ชันต้องการที่จะดำเนินคประกาศ
IEnumerator<TValue>
:
public IEnumerator<TValue> GetEnumerator()
IEnumerator IEnumerable.GetEnumerator()
- หนึ่งยังโลกอีกด้านหนึ่งผมจะลงทุนทุกสิ่งทุกอย่างอื่น:
- ในพจนานุกรมปล่อยให้เธอได้หายใจอยู่อีและ intialization
- อีก enumerator:
public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
public int Count => _theDictionary.Count;
public void Add(TKey key, TValue value)