คำถามติดแท็ก c#-8.0

สำหรับปัญหาที่เกี่ยวข้องกับการพัฒนาด้วยภาษา C # เวอร์ชัน 8.0 เวอร์ชันนี้เพิ่มประเภทการอ้างอิงที่เป็นโมฆะวิธีการอินเตอร์เฟสเริ่มต้นการแจงนับ async และคุณสมบัติและการปรับปรุงอื่น ๆ

1
ทำไมดัชนีผู้ประกอบการหมวกใหม่ไม่ได้จากคุณสมบัติการแบ่งอาร์เรย์ C # 8 เริ่มต้นที่ 0
C # 8.0 แนะนำวิธีการที่สะดวกในการอาร์เรย์ชิ้น - เห็นอย่างเป็นทางการ C # 8.0 blogpost ไวยากรณ์ในการเข้าถึงองค์ประกอบสุดท้ายของอาร์เรย์คือ int value[] = { 10, 11, 12, 13 }; int a = value[^1]; // 13 int b = value[^2]; // 12 ฉันสงสัยว่าทำไมการสร้างดัชนีสำหรับการเข้าถึงองค์ประกอบย้อนหลังเริ่มต้นที่ 1 แทนที่จะเป็น 0 มีเหตุผลทางเทคนิคสำหรับสิ่งนี้หรือไม่?
156 c#  arrays  indexing  c#-8.0 

3
C # 8 รองรับ. NET Framework หรือไม่
ในการตั้งค่าการสร้างขั้นสูงของ Visual Studio 2019 C # 8 ดูเหมือนจะไม่พร้อมใช้งานสำหรับโครงการ. NET Framework เท่านั้น (ดังภาพด้านล่าง) สำหรับโครงการ. NET Core 3.0: C # 8 รองรับ. NET Framework หรือไม่

3
“ คือ {}” หมายความว่าอะไร
ฉันเห็นโค้ดต่อไปนี้ในบางครั้งและไม่ทราบว่านิพจน์กำลังทดสอบอะไรอยู่ public static void Something(string[] value) { if (value is { }) { DoSomethingElse(); } }
36 c#  c#-8.0 

2
สร้าง IAsyncE เปล่าที่ว่างเปล่า
ฉันมีอินเตอร์เฟซที่เขียนแบบนี้: public interface IItemRetriever { public IAsyncEnumerable<string> GetItemsAsync(); } ฉันต้องการเขียนการใช้งานเปล่า ๆ ที่ไม่มีรายการคืนมาเช่น: public class EmptyItemRetriever : IItemRetriever { public IAsyncEnumerable<string> GetItemsAsync() { // What do I put here if nothing is to be done? } } หากเป็น IEnumerable ธรรมดาฉันจะreturn Enumerable.Empty<string>();แต่ฉันไม่พบอะไรAsyncEnumerable.Empty<string>()เลย วิธีการแก้ปัญหา ฉันพบสิ่งนี้ซึ่งใช้งานได้ แต่ค่อนข้างแปลก: public async IAsyncEnumerable<string> GetItemsAsync() { await Task.CompletedTask; …

1
เหตุใดฉันจึงประกาศตัวแปรลูกที่มีชื่อเดียวกันกับตัวแปรในขอบเขตพาเรนต์
ฉันเขียนโค้ดบางส่วนเมื่อเร็ว ๆ นี้ซึ่งฉันนำชื่อตัวแปรมาใช้ซ้ำโดยไม่ได้ตั้งใจเป็นพารามิเตอร์ของการดำเนินการที่ประกาศไว้ในฟังก์ชันที่มีตัวแปรชื่อเดียวกันอยู่แล้ว ตัวอย่างเช่น: var x = 1; Action<int> myAction = (x) => { Console.WriteLine(x); }; เมื่อฉันเห็นการทำสำเนาฉันรู้สึกประหลาดใจเมื่อเห็นว่าโค้ดรวบรวมและทำงานได้อย่างสมบูรณ์แบบซึ่งไม่ใช่พฤติกรรมที่ฉันคาดหวังจากสิ่งที่ฉันรู้เกี่ยวกับขอบเขตใน C # บาง Googling รวดเร็วเปิดขึ้นดังนั้นคำถามที่บ่นว่ารหัสที่คล้ายกันไม่สร้างข้อผิดพลาดเช่นแลมบ์ดาขอบเขตชี้แจง (ฉันวางโค้ดตัวอย่างนั้นลงใน IDE ของฉันเพื่อดูว่ามันจะทำงานได้หรือไม่เพื่อให้แน่ใจว่ามันจะทำงานได้อย่างสมบูรณ์) นอกจากนี้เมื่อฉันป้อนกล่องโต้ตอบเปลี่ยนชื่อใน Visual Studio สิ่งแรกxจะถูกเน้นเป็นชื่อที่ขัดแย้งกัน ทำไมรหัสนี้ใช้งานได้? ฉันใช้ C # 8 กับ Visual Studio 2019

1
ความแตกต่างระหว่างการใช้และรอการใช้งานคืออะไร? และฉันจะตัดสินใจได้อย่างไรว่าจะใช้อันไหน
ฉันสังเกตเห็นว่าในบางกรณี Visual Studio แนะนำให้ทำเช่นนี้ await using var disposable = new Disposable(); // Do something แทนสิ่งนี้ using var disposable = new Disposable(); // Do something ความแตกต่างระหว่างusingและawait usingคืออะไร? ฉันจะตัดสินใจได้อย่างไรว่าควรใช้อันไหน
21 c#  c#-8.0 

3
วิธีปฏิบัติที่ดีที่สุดสำหรับการใช้ประเภทข้อมูลอ้างอิงที่เป็นโมฆะสำหรับ DTO
ฉันมี DTO ซึ่งบรรจุด้วยการอ่านจากตาราง DynamoDB พูดว่าตอนนี้ดูเหมือนว่านี้: public class Item { public string Id { get; set; } // PK so technically cannot be null public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks public string Description { get; set; } // can …

1
แปลง IAsyncEnumerable เป็น List
ดังนั้นใน C # 8 เราจึงได้เพิ่มIAsyncEnumerableส่วนต่อประสาน หากเรามีสิ่งปกติIEnumerableเราสามารถสร้างListคอลเล็กชั่นอื่น ๆ ที่เราต้องการได้ ขอบคุณ Linq ที่นั่น var range = Enumerable.Range(0, 100); var list = range.ToList(); ตอนนี้ฉันต้องการแปลงIAsyncEnumerableเป็น a Listและแน่นอนแบบอะซิงโครนัส มีการใช้งาน Linq สำหรับกรณีนั้นหรือไม่? ถ้าไม่มีฉันจะแปลงเป็นตัวเองได้อย่างไร

1
Nullability ที่ไม่รู้จักใน C # 8 คืออะไร
ใน C # 8.0 เราสามารถมีประเภทอ้างอิงที่เป็นโมฆะ เอกสารระบุว่ามีความผิดประเภท 4 ประเภท 3 รายการแรกค่อนข้างชัดเจน แต่ฉันไม่เข้าใจจุดที่ "ไม่ทราบ" เอกสารบอกว่ามันใช้กับยาชื่อสามัญ แต่เมื่อฉันพยายามเรียกวิธีการเกี่ยวกับตัวแปรที่ไม่มีข้อ จำกัด ของประเภท T ในข้อมูลทั่วไปมันแค่เตือนราวกับว่าประเภทนั้นเป็นโมฆะ ฉันไม่เห็นความแตกต่างระหว่างที่ไม่รู้จักและไม่สามารถใช้ได้ ทำไมไม่รู้จักอยู่? มันแสดงให้เห็นตัวเองได้อย่างไร

4
ลบ deserializing รายการโดยใช้ Asynchonously System.Text.Json
ให้บอกว่าฉันขอไฟล์ json ขนาดใหญ่ที่มีรายการวัตถุมากมาย ฉันไม่ต้องการให้พวกเขาอยู่ในความทรงจำทั้งหมดในครั้งเดียว แต่ฉันอยากอ่านและดำเนินการทีละคน ดังนั้นผมจึงจำเป็นต้องเปิด async กระแสเป็นSystem.IO.Stream IAsyncEnumerable<T>ฉันจะใช้System.Text.JsonAPI ใหม่เพื่อทำสิ่งนี้ได้อย่างไร private async IAsyncEnumerable<T> GetList<T>(Uri url, CancellationToken cancellationToken = default) { using (var httpResponse = await httpClient.GetAsync(url, cancellationToken)) { using (var stream = await httpResponse.Content.ReadAsStreamAsync()) { // Probably do something with JsonSerializer.DeserializeAsync here without serializing the entire thing in one go …

5
ประเภทอ้างอิงที่ไม่เป็นโมฆะใน C # 8 สามารถเป็นโมฆะในรันไทม์หรือไม่
ดูเหมือนว่าสำหรับฉันไม่มีการรับประกันว่าตัวแปรที่ไม่เป็นโมฆะจะไม่มีโมฆะ ลองนึกภาพฉันมีชั้นเรียนที่มีคุณสมบัติหนึ่งที่ไม่เป็นโมฆะ: public class Foo { public Foo(string test) { Test = test; } public string Test {get;set;} } ตอนนี้อาจดูเหมือนว่าตอนนี้ไม่สามารถเป็นค่าว่างได้ แต่ถ้าเราอ้างอิงคลาสนี้กับไลบรารี่อื่นที่ไม่ได้ใช้บริบทที่ไม่มีค่าใด ๆ จะไม่มีสิ่งใดหยุดมันจากการส่งค่า null ในนั้น ถูกต้องหรือมีการตรวจสอบรันไทม์บางอย่างเช่นกันซึ่งอาจทำให้แน่ใจได้

3
มีระเบียบการตั้งชื่อที่ชัดเจนสำหรับวิธีการส่งคืน IAsyncEnumerable หรือไม่
หลังจาก C # 5 แนะนำasyncและawaitโมเดลสำหรับการโปรแกรมแบบอะซิงโครนัสชุมชน C # มาถึงการประชุมการตั้งชื่อเพื่อเพิ่มคำต่อท้าย "Async" ลงในเมธอดที่ส่งคืนชนิดที่ไม่ต้องรอคอยเช่นนี้ interface Foo { Task BarAsync(); } เครื่องวิเคราะห์รหัสแบบสแตติกจำนวนมาก (ทั้งที่ใช้แบบ Roslyn และแบบที่ไม่ใช่แบบ Roslyn) ได้ถูกเขียนขึ้นอยู่กับแบบแผนการตั้งชื่อนี้เมื่อตรวจจับกลิ่นรหัสรอบโปรแกรมแบบอะซิงโครนัส ตอนนี้ C # 8 ได้นำเสนอแนวคิดของการแจกแจงแบบอะซิงโครนัสซึ่งตัวเองไม่สามารถรอได้ แต่สามารถใช้ร่วมกับawait foreachดูเหมือนว่ามีสองตัวเลือกสำหรับวิธีการตั้งชื่อที่ส่งคืนIAsyncEnumerable: interface Foo { // No "Async" suffix, indicating that the return value is not awaitable. IAsyncEnumerable<T> Bar<T>(); } หรือ interface Foo …
10 c#  c#-8.0 

1
ข้อมูลประเภทการอ้างอิงที่เป็นโมฆะไม่ถูกเปิดเผยจาก FirstOrDefault
ฉันต้องการทดสอบคุณลักษณะการอ้างอิงชนิด nullableใหม่ใน C # 8.0 ฉันเริ่มโครงการใหม่ที่กำหนดเป้าหมายเป็น. NET Core 3.0 เปิดใช้งานประเภทการอ้างอิง nullable ใน.csprojไฟล์และเริ่มการเข้ารหัส ฉันสร้างรายการที่เรียบง่ายที่จะใช้เวลาstring[]และการส่งกลับในอาร์เรย์ที่เท่าเทียมกันstring abcตอนนี้เนื่องจากฉันไม่แน่ใจว่าabcมีอยู่จริงในอาร์เรย์ฉันใช้FirstOrDefault()ซึ่งควรเริ่มต้นnullหากไม่พบการจับคู่ using System; using System.Linq; public string FindArgument(string[] args) { var arg = args.FirstOrDefault(x => x == "abc"); return arg; } วิธีการส่งกลับของฉันstringซึ่งควรในขณะนี้เป็นที่ไม่ใช่ nullableประเภท เนื่องจากFirstOrDefault()อาจส่งคืนnullฉันคาดหวังว่าวิธีการข้างต้นให้คำเตือนเมื่อส่งกลับตัวแปรอาจเป็นโมฆะ argมันไม่ใช่. เมื่อมองที่ลายเซ็นต์สำหรับFirstOrDefault()ใน Visual Studio จะเห็นได้ชัดว่าทำไม : วิธีการส่งกลับค่าstringไม่ใช่สิ่งที่เทียบเท่าได้ซึ่งstring?ฉันคาดหวัง การใช้วิธีการต่อไปนี้จะให้คำเตือนที่ฉันคาดไว้ var arg = args.Contains("abc") ? …

1
ฉันจะเรียกวิธีการเริ่มต้นแทนการใช้งานที่เป็นรูปธรรมได้อย่างไร
ทำไมพฤติกรรมของวิธีการเชื่อมต่อเริ่มต้นเปลี่ยนไปใน C # 8 ในอดีตรหัสต่อไปนี้ (เมื่อวิธีการอินเทอร์เฟซเริ่มต้นถูกสาธิตไม่ออก): interface IDefaultInterfaceMethod { // By default, this method will be virtual, and the virtual keyword can be here used! virtual void DefaultMethod() { Console.WriteLine("I am a default method in the interface!"); } } interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod { void IDefaultInterfaceMethod.DefaultMethod() { Console.WriteLine("I am an …

2
ทำไมเราถึงได้เป็นไปได้ dereference คำเตือนอ้างอิงโมฆะเมื่อการอ้างอิงโมฆะดูเหมือนจะเป็นไปไม่ได้?
เมื่ออ่านคำถามนี้ทาง HNQ ฉันได้อ่านเกี่ยวกับประเภทข้อมูลอ้างอิงที่น่าเบื่อใน C # 8และทำการทดลองบางอย่าง ฉันรู้ว่า 9 ครั้งใน 10 ครั้งหรือบ่อยกว่านั้นเมื่อมีคนพูดว่า "ฉันพบข้อผิดพลาดในการคอมไพเลอร์!" นี่คือการออกแบบและความเข้าใจผิดของพวกเขาเอง และตั้งแต่ฉันเริ่มมองหาคุณลักษณะนี้เฉพาะในวันนี้อย่างชัดเจนฉันไม่เข้าใจมันมากนัก ด้วยวิธีนี้ให้ดูที่รหัสนี้: #nullable enable class Program { static void Main() { var s = ""; var b = s == null; // If you comment this line out, the warning on the line below disappears var i …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.