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

C # เป็นภาษาการเขียนโปรแกรมเชิงวัตถุที่มีการจัดการและรวบรวมขยะที่สร้างขึ้นโดย Microsoft ควบคู่ไปกับแพลตฟอร์ม. NET

2
เหตุใด C # ช่วยให้คุณสามารถแทนที่ async ได้
ใน C # เมื่อคุณแทนที่เมธอดจะอนุญาตให้ทำการแทนที่ async เมื่อไม่ได้ใช้วิธีดั้งเดิม ดูเหมือนว่ารูปแบบไม่ดี ตัวอย่างที่นำฉันมาสู่สิ่งนี้คือสิ่งนี้ - ฉันถูกนำตัวเข้ามาเพื่อช่วยแก้ไขปัญหาการทดสอบโหลด มีผู้ใช้งานพร้อมกันประมาณ 500 คนกระบวนการเข้าสู่ระบบจะแยกย่อยในการวนรอบการเปลี่ยนเส้นทาง IIS กำลังบันทึกข้อยกเว้นด้วยข้อความ "โมดูลหรือตัวจัดการแบบอะซิงโครนัสเสร็จสมบูรณ์ในขณะที่การดำเนินการแบบอะซิงโครนัสยังคงค้างอยู่" การค้นหาบางอย่างทำให้ฉันคิดว่ามีใครบางคนกำลังดูถูกเหยียดหยามasync voidแต่การค้นหาอย่างรวดเร็วของฉันผ่านทางแหล่งข้อมูลไม่พบสิ่งใดเลย น่าเศร้าที่ฉันกำลังค้นหา 'async \ svoid' (การค้นหา regex) เมื่อฉันควรมองหาบางสิ่งเพิ่มเติมเช่น 'async \ s [^ T]' (สมมติว่า Task ไม่ผ่านการรับรอง ... คุณเข้าใจแล้ว) สิ่งที่ฉันพบภายหลังคือasync override void onActionExecuting(...ตัวควบคุมพื้นฐาน เห็นได้ชัดว่าจะต้องมีปัญหาและมันก็เป็น แก้ไขปัญหาที่เกิดขึ้น (ทำให้ซิงโครนัสสักครู่) แก้ไขปัญหา กลับไปที่คำถาม: ทำไมโอทำไมคุณสามารถทำเครื่องหมาย override เป็น async เมื่อรหัสการโทรไม่สามารถรอได้?
16 c#  async 

4
อะไรคือข้อเสียของการจับคู่ตัวบ่งชี้สำคัญกับ enums?
ฉันคิดว่าจะสร้างประเภทที่กำหนดเองสำหรับตัวระบุเช่นนี้: public enum CustomerId : int { /* intentionally empty */ } public enum OrderId : int { } public enum ProductId : int { } แรงจูงใจหลักของฉันในการทำเช่นนี้คือเพื่อป้องกันข้อผิดพลาดชนิดที่คุณบังเอิญส่งคำสั่ง orderItemId ไปยังฟังก์ชันที่คาดว่าจะมี orderItemDetailId ดูเหมือนว่า enums ทำงานได้อย่างราบรื่นกับทุกสิ่งที่ฉันต้องการใช้ในเว็บแอปพลิเคชัน. NET ทั่วไป: การกำหนดเส้นทาง MVC ทำงานได้ดี การทำให้เป็นอันดับ JSON ทำงานได้ดี ทุก ๆ ออมที่ฉันสามารถคิดได้ผลดี ดังนั้นตอนนี้ฉันสงสัยว่า "ทำไมฉันไม่ควรทำเช่นนี้?" นี่เป็นข้อเสียอย่างเดียวที่ฉันนึกได้: มันอาจสร้างความสับสนให้นักพัฒนาอื่น ๆ มันแนะนำความไม่สอดคล้องในระบบของคุณหากคุณมีตัวระบุที่ไม่ครบถ้วน …
16 c# 

2
การทำให้เป็นอันดับและการดีซีเรียลไลเซชั่นควรเป็นความรับผิดชอบของชั้นเรียนหรือไม่
ขณะนี้ฉันอยู่ในขั้นตอนการออกแบบ (อีกครั้ง) ของคลาสรุ่นต่างๆของแอปพลิเคชัน C # .NET (โมเดลดังใน M ของ MVC) คลาสโมเดลมีข้อมูลพฤติกรรมและความสัมพันธ์ซึ่งได้รับการออกแบบมาเป็นอย่างดี ฉันเขียนแบบจำลองใหม่จาก Python เป็น C # ใน Python model ฉันคิดว่าฉันเห็นหูด แต่ละรุ่นรู้วิธีการทำให้เป็นอันดับตัวเองและตรรกะการทำให้เป็นอันดับไม่มีส่วนเกี่ยวข้องกับพฤติกรรมที่เหลือของคลาสใด ๆ ตัวอย่างเช่นลองนึกภาพ: Imageชั้นเรียนด้วย.toJPG(String filePath) .fromJPG(String filePath)วิธีการ ImageMetaDataชั้นเรียนด้วย.toString()และ.fromString(String serialized)วิธีการ คุณสามารถจินตนาการได้ว่าวิธีการทำให้เป็นอันดับเหล่านี้ไม่ได้เชื่อมโยงกับส่วนที่เหลือของชั้นเรียน แต่มีเพียงชั้นเรียนเท่านั้นที่สามารถรับประกันได้ว่าจะรู้ข้อมูลที่เพียงพอในการทำให้เป็นอันดับตัวเอง มันเป็นเรื่องธรรมดาสำหรับชั้นเรียนหรือไม่ที่จะรู้วิธีการทำให้เป็นอันดับและทำให้เสียความเป็นตัวของตัวเอง? หรือฉันไม่มีรูปแบบทั่วไป

7
เราสามารถทำอะไรเพื่อปรับปรุงความสามารถในการอ่านของโค้ดเชิงคณิตศาสตร์ใน C #, Java และสิ่งที่คล้ายกัน? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ในฐานะที่เป็นทั้งโปรแกรมเมอร์ C และโปรแกรมเมอร์ C # สิ่งหนึ่งที่ฉันไม่ชอบเกี่ยวกับ C # ก็คือฟังก์ชั่นคณิตศาสตร์ verbose เป็นอย่างไร ทุกครั้งที่คุณต้องใช้ฟังก์ชัน Sin, cosine หรือ power คุณจะต้องเพิ่มคลาสสถิตแบบคณิตศาสตร์ล่วงหน้า สิ่งนี้นำไปสู่โค้ดที่ยาวมากเมื่อสมการนั้นง่ายมาก ปัญหาจะยิ่งแย่ลงหากคุณต้องการพิมพ์ข้อมูลชนิด ดังนั้นในความคิดของฉันการอ่านได้รับความเดือดร้อน ตัวอย่างเช่น: double x = -Math.Cos(X) * Math.Sin(Z) + Math.Sin(X) * Math.Sin(Y) * Math.Cos(Z); ตรงข้ามกับเพียงแค่ double x = -cos(X) * sin(Z) + sin(X) * …
16 java  c#  math  readability 

1
เหตุใดจึงใช้วิธีการทางเวทมนตร์ใน C #
ใน C # ฉันเริ่มเห็นวิธีการมายากลเหล่านี้ทั้งหมดโผล่ขึ้นมาโดยไม่ต้องสำรองข้อมูลโดยอินเทอร์เฟซ ทำไมถึงถูกเลือก? ให้ฉันอธิบาย ก่อนหน้านี้ใน C # หากวัตถุใช้IEnumerableอินเตอร์เฟสมันจะforeachวนซ้ำโดยอัตโนมัติ นั่นทำให้รู้สึกถึงฉันเนื่องจากมีการสำรองข้อมูลโดยอินเทอร์เฟซและถ้าฉันต้องมีIteratorฟังก์ชันของตัวเองในชั้นเรียนที่ถูกทำซ้ำฉันสามารถทำได้โดยไม่ต้องกังวลว่ามันจะมีความหมายอย่างอื่นอย่างน่าอัศจรรย์ เห็นได้ชัดว่าตอนนี้ (ไม่แน่ใจว่าเมื่อใด) อินเตอร์เฟสเหล่านี้ไม่จำเป็นอีกต่อไป เพียงแค่ต้องมีการแปลงชื่อที่ถูกต้อง อีกตัวอย่างหนึ่งคือการทำให้ awaitable วัตถุใด ๆ โดยมีวิธีการตั้งชื่อตรง GetAwaiterที่มีคุณสมบัติเฉพาะไม่กี่ ทำไมไม่สร้างอินเทอร์เฟซอย่างที่พวกเขาทำกับIEnumerableหรือINotifyPropertyChangedสำรอง "เวทย์มนตร์" นี้ขึ้นมาแบบคงที่? รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่ฉันหมายถึงที่นี่: http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/ อะไรคือข้อดีและข้อเสียของวิธีการเวทย์มนตร์และมีที่ไหนออนไลน์ที่ฉันสามารถหาอะไรเกี่ยวกับสาเหตุการตัดสินใจเหล่านี้?
16 c# 

4
มีข้อเสียในการใช้ AggressiveInlining ในคุณสมบัติง่าย ๆ ?
ฉันพนันได้เลยว่าฉันจะตอบว่าตัวเองถ้าฉันรู้เพิ่มเติมเกี่ยวกับเครื่องมือในการวิเคราะห์พฤติกรรมของ C # / JIT แต่เนื่องจากฉันไม่ได้โปรดอดทนกับฉันถาม ฉันมีรหัสง่าย ๆ เช่นนี้: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } อย่างที่คุณเห็นฉันใส่ AggressiveInlining เพราะฉันรู้สึกว่ามันควรจะถูกแทรก ฉันคิด. ไม่มีการรับประกันว่า JIT จะเป็นแบบอินไลน์ ฉันผิดหรือเปล่า? การทำสิ่งนี้อาจส่งผลกระทบต่อประสิทธิภาพ / ความเสถียร / อะไรหรือไม่?

3
ยาชื่อสามัญมีการใช้งานอย่างไร?
นี่คือคำถามจากมุมมองภายในของคอมไพเลอร์ ฉันสนใจ generics ไม่ใช่แม่แบบ (C ++) ดังนั้นฉันจึงทำเครื่องหมายคำถามด้วย C # ไม่ใช่ Java เพราะ AFAIK ข้อมูลทั่วไปในทั้งสองภาษานั้นแตกต่างกันในการนำไปใช้งาน เมื่อฉันดูภาษาที่ไม่มี generics มันค่อนข้างตรงไปตรงมาคุณสามารถตรวจสอบคำจำกัดความของคลาสเพิ่มลงในลำดับชั้นและนั่นคือมัน แต่จะทำอย่างไรกับชั้นเรียนทั่วไปและที่สำคัญกว่านั้นจัดการกับการอ้างอิงได้อย่างไร วิธีตรวจสอบให้แน่ใจว่าฟิลด์คงที่นั้นเป็นเอกพจน์ต่ออินสแตนซ์ (เช่นแต่ละครั้งที่พารามิเตอร์ทั่วไปได้รับการแก้ไข) สมมติว่าฉันเห็นสาย: var x = new Foo<Bar>(); ฉันจะเพิ่มFoo_Barคลาสใหม่ให้กับลำดับชั้นหรือไม่ อัปเดต:จนถึงตอนนี้ฉันพบเพียง 2 โพสต์ที่เกี่ยวข้อง แต่ถึงแม้ว่าพวกเขาจะไม่ได้ลงรายละเอียดมากในแง่ "วิธีการทำด้วยตัวเอง": http://www.jprl.com/Blog/archive/development/2007/Aug-31.html http://www.artima.com/intv/generics2.html
16 c#  generics 

1
ทำความเข้าใจกับรูปแบบของผู้มาเยี่ยม
ฉันมีลำดับชั้นของชั้นเรียนที่แสดงถึงการควบคุม GUI บางสิ่งเช่นนี้ Control->ContainerControl->Form ฉันต้องใช้ชุดของ algoritms ที่ทำงานกับวัตถุที่ทำสิ่งต่าง ๆ และฉันคิดว่ารูปแบบของผู้เข้าชมจะเป็นวิธีที่สะอาดที่สุด ลองยกตัวอย่างเช่นอัลกอริทึมที่สร้าง Xml Representaion ของลำดับชั้นของวัตถุ ใช้วิธี 'คลาสสิค' ฉันจะทำสิ่งนี้: public abstract class Control { public virtual XmlElement ToXML(XmlDocument document) { XmlElement xml = document.CreateElement(this.GetType().Name); // Create element, fill it with attributes declared with control return xml; } } public abstract class ContainerControl : …

3
BackgroundWorker vs. Async / Await
ฉันยังใหม่กับการพัฒนา C # และต้องการสร้าง UI ที่ตอบสนองได้ดีขึ้น ในการวิจัยเบื้องต้นของฉันฉันเห็นสองวิธีในการบรรลุเป้าหมายนี้: มัลติเธรดร่วมกับคลาส BackgroundWorker ตัวดัดแปลง Async / Await ที่ใหม่กว่า ใหม่กว่าหมายความว่าดีกว่า ความแตกต่างระหว่างสองวิธีคืออะไร หากฉันต้องการสร้างโครงการใหม่ฉันจะเลือกวิธีที่จะไปด้วยได้อย่างไร แก้ไข: บางทีฉันควรระบุ ฉันกำลังสร้างแอปพลิเคชัน Windows Forms ซึ่งข้อมูลที่จำเป็นทั้งหมดจะถูกบันทึก / โหลดบนดิสก์ภายในเครื่อง ฉันจะสื่อสารกับอุปกรณ์ USB หลายแห่งด้วย

5
การใช้คำสำคัญ“ การใช้” ในอินเตอร์เฟซ C #
เมื่อฉันใช้ C # เพื่อเขียนโค้ดบางส่วนและฉันกำหนดอินเทอร์เฟซโดยใช้ Visual Studio 2010 จะมีคำสั่ง "ใช้" จำนวนมาก (ดังแสดงในตัวอย่าง) using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestEngine.TestNameSpace { interface ITest1 { bool testMethod(int xyz); } } ฉันสงสัยว่าสิ่งเหล่านี้มีไว้เพื่ออะไรและหากจำเป็นจริงๆ ฉันจะออกไปได้ไหม? จำเป็นหรือไม่เมื่อฉันใช้ส่วนเหล่านั้นในคำอธิบายส่วนต่อประสานของฉัน

3
แบบแผนการตั้งชื่อสำหรับวัตถุล็อคเธรดเฉพาะ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว คำถามเล็ก ๆ น้อย ๆ แต่ฉันไม่สามารถหาเอกสารอย่างเป็นทางการหรือแม้กระทั่งบล็อกความคิดเห็น / การอภิปรายเกี่ยวกับมัน พูดง่ายๆ: เมื่อฉันมีวัตถุส่วนตัวซึ่งมีจุดประสงค์เพียงอย่างเดียวที่จะให้บริการส่วนตัวlockฉันจะตั้งชื่อวัตถุนั้นว่าอะไร class MyClass { private object LockingObject = new object(); void DoSomething() { lock(LockingObject) { //do something } } } เราควรตั้งชื่อLockingObjectอะไรที่นี่? นอกจากนี้ให้พิจารณาไม่ใช่แค่ชื่อของตัวแปร แต่จะมีลักษณะอย่างไรเมื่ออยู่ในโค้ดเมื่อล็อค ฉันเคยเห็นตัวอย่างหลายอย่าง แต่ดูเหมือนไม่มีคำแนะนำที่ชัดเจน การใช้งานมากมายSyncRoot(และรูปแบบเช่น_syncRoot) ตัวอย่างโค้ด: lock(SyncRoot) ,lock(_syncRoot) สิ่งนี้ดูเหมือนจะได้รับอิทธิพลจากSyncLockคำสั่งที่เทียบเท่าของ VB SyncRootคุณสมบัติที่มีอยู่ในคลาส ICollection บางส่วนและเป็นส่วนหนึ่งของรูปแบบการออกแบบ SyncRoot …

4
ฉันควรเลือกคุณสมบัติที่มีหรือไม่มีฟิลด์ส่วนตัวหรือไม่?
codebase ที่ฉันกำลังทำงานอยู่ในขณะนี้มีแบบแผนของการใช้เขตข้อมูลส่วนตัวและคุณสมบัติสาธารณะ ตัวอย่างเช่นคลาสส่วนใหญ่มีสมาชิกกำหนดไว้ดังนี้: // Fields private double _foo; private double _bar; private double _baz; // Properties public double Foo { get{ return _foo; } set{ _foo = value; } } public double Bar { get{ return _bar; } set{ _bar = value; } } public double Baz { get{ return …
16 c#  coding-style 

5
วิธีจัดโครงสร้างหน่วยทดสอบสำหรับแอป GUI โดยใช้ C # และ NUnit
ฉันถูกขอให้ทำโครงการขนาดเล็กเพื่อจัดหาแอพพลิเคชั่นที่เรียบง่ายให้กับลูกค้าของเรา โดยปกติแล้วฉันจะทำงานกับรหัสแบ็คเอนด์ที่ฉันต้องทำการทดสอบทั้งหมดและฉันยังไม่ได้มีความสุขที่น่าสงสัยในการเขียนการทดสอบสำหรับ GUI ดังนั้นจึงไม่ค่อยชัดเจนสำหรับฉันที่จะตั้งค่า รหัสการทดสอบและเครื่องมือสำหรับ EXE สัญชาตญาณแรกของฉันคือการรวมการทดสอบด้วยรหัสแอปพลิเคชัน แต่ต้องมีการจัดหาการอ้างอิงเฉพาะสำหรับการทดสอบจำนวนมากซึ่งฉันได้รับคำสั่งให้ไม่ส่งมอบให้กับลูกค้าโดยเฉพาะ ฉันยังไม่สามารถบีบเงินสดเพื่อใช้เป็นเครื่องมือทดสอบที่สร้างขึ้นมาได้ดังนั้นฉันต้องใช้เครื่องมือที่มีอยู่ในมือ ( StoryQ , RhinoMocksและNUnit) ซึ่งควรเกินพอที่จะทดสอบพฤติกรรมของแอพ GUI อย่างง่าย ดังนั้นเท่าที่ฉันเห็นนี่ทำให้ฉันพยายามสร้างสมดุลที่ดีระหว่างการออกแบบให้เรียบง่ายหรือใช้วิศวกรรมมากเกินไปเพื่อการทดสอบ ดูเหมือนว่าฉันกำลังสร้างแอปด้วยตรรกะทางธุรกิจในห้องสมุดแยกต่างหากและทดสอบกับห้องสมุดอย่างที่ฉันมักจะทำหรือค้นหากลไกอื่น ๆ เพื่อให้ฉันสามารถดำเนินการได้โดยไม่แยกโมดูลเพิ่มเติมที่การออกแบบแอปพลิเคชันไม่ ต้องการจริงๆ แก้ไข: โปรดทราบว่าคำถามนี้เกี่ยวกับวิธีการจัดโครงสร้างความสัมพันธ์ระหว่าง NUnit และปฏิบัติการของฉัน - ซึ่งต่างกับ DLL - และไม่เกี่ยวกับวิธีแยกงานนำเสนอและตรรกะทางธุรกิจ / แก้ไข ดังนั้นคำถามของฉันคือ: มีวิธีเฉพาะ / แนะนำสำหรับการกำหนดค่าแอปพลิเคชัน GUI อย่างง่ายพร้อมการทดสอบหน่วยเพื่อให้ฉันตรวจสอบสถานะและพฤติกรรมอย่างเพียงพอโดยใช้เครื่องมือที่ฉันมีอยู่ในมือและไม่ต้องใช้วิธีการทางวิศวกรรมมากเกินไป? ฉันพลาดพื้นฐานบางอย่างเกี่ยวกับวิธีที่ NUnit ควรเรียกใช้ / กำหนดค่าเมื่อทำการทดสอบ EXE (ตรงข้ามกับ DLL) คุณสามารถให้หรือชี้ให้ฉันในทิศทางของตัวอย่างของการบรรลุทั้งหมดนี้ได้อย่างไร ฉันรู้ว่าอาจมีหลายวิธีในการทำเช่นนี้ฉันจึงมองหาแนวทางการใช้งานเฉพาะตามประสบการณ์ของคุณ
16 c#  testing  gui  nunit 

3
Async C # 5 จะสนับสนุนปัญหาการซิงโครไนซ์เธรด UI อย่างไร
ฉันได้ยินบางที่ Cync ที่รอคอย async จะยอดเยี่ยมมากจนคุณไม่ต้องกังวลเกี่ยวกับการทำเช่นนี้: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here ดูเหมือนว่าการเรียกกลับของการดำเนินการที่รอจะเกิดขึ้นในเธรดต้นฉบับของผู้โทร มีการระบุไว้หลายครั้งโดย Eric Lippert และ Anders Hejlsberg ว่าคุณลักษณะนี้มีต้นกำเนิดมาจากความต้องการที่จะทำให้ UIs (โดยเฉพาะ UIs อุปกรณ์สัมผัส) ตอบสนองได้ดียิ่งขึ้น ฉันคิดว่าการใช้คุณสมบัติทั่วไปเช่นนี้จะเป็นดังนี้: public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; …

6
วิธีแก้ปัญหาการเข้าใช้ใหม่แบบ Async C # 5
ดังนั้นมีบางอย่างเกี่ยวกับฉันที่สนับสนุน async ใหม่ใน C # 5: ผู้ใช้กดปุ่มที่เริ่มการทำงานของ async การโทรจะส่งกลับทันทีและปั๊มข้อความเริ่มทำงานอีกครั้งนั่นคือจุดรวม ดังนั้นผู้ใช้สามารถกดปุ่มอีกครั้ง - ก่อให้เกิดความเชื่อมั่นอีกครั้ง เกิดอะไรขึ้นถ้านี่เป็นปัญหา ในตัวอย่างที่ฉันได้เห็นพวกเขาจะปิดใช้งานปุ่มก่อนการawaitโทรและเปิดใช้งานอีกครั้งหลังจากนั้น ดูเหมือนว่าฉันจะเป็นทางออกที่เปราะบางมากในแอปที่ใช้งานจริง เราควรเขียนรหัสสถานะเครื่องจักรบางอย่างที่ระบุว่าต้องปิดการใช้งานการควบคุมใดสำหรับชุดการทำงานที่กำหนดไว้ หรือมีวิธีที่ดีกว่า ฉันอยากที่จะแสดงกล่องโต้ตอบเป็นกิริยาช่วยในช่วงระยะเวลาของการดำเนินการ แต่นี่รู้สึกเหมือนใช้ค้อนขนาดใหญ่ มีใครมีความคิดที่สดใสบ้างไหม แก้ไข: ฉันคิดว่าการปิดใช้งานการควบคุมที่ไม่ควรใช้ในขณะที่การดำเนินการกำลังทำงานอยู่มีความเปราะบางเพราะฉันคิดว่ามันจะซับซ้อนอย่างรวดเร็วเมื่อคุณมีหน้าต่างที่มีการควบคุมมากมาย ฉันชอบที่จะทำให้สิ่งต่าง ๆ เรียบง่ายเพราะมันช่วยลดโอกาสในการเกิดข้อบกพร่องทั้งในระหว่างการเข้ารหัสเริ่มต้นและการบำรุงรักษาที่ตามมา จะเกิดอะไรขึ้นถ้ามีชุดควบคุมที่ควรปิดใช้งานสำหรับการดำเนินการเฉพาะอย่าง และจะเกิดอะไรขึ้นถ้าการทำงานหลายอย่างทำงานพร้อมกัน?

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