static
คำหลักอาจจะเป็นเพียงเล็กน้อยยากสำหรับมือใหม่ที่จะเข้าใจ จุดประสงค์หลักของมันคือเพื่อระบุสมาชิกคลาสที่ไม่ได้เป็นของอินสแตนซ์เดียวของคลาส แต่แทนที่จะเป็นคลาสเอง
โดยไม่ต้องลงรายละเอียดมากเกินไป C # (และ Java) บังคับใช้อุดมคติเชิงวัตถุอย่างเข้มงวดว่ารหัสและข้อมูลทั้งหมดจะต้องเป็นของวัตถุดังนั้นจึงมีข้อ จำกัด ในขอบเขตการมองเห็นและอายุการใช้งาน โดยทั่วไปแล้ววิธีปฏิบัติที่ดีที่สุดคือที่ใดก็ตามที่มีหลักการพื้นฐานของวัตถุที่แสดงถึงสิ่งที่มีอยู่จริงในโลก อย่างไรก็ตามมันไม่ได้เสมอ บางครั้งสิ่งที่คุณต้องมีฟังก์ชั่นหรือตัวแปรที่คุณจะได้รับจากที่ใดก็ได้ในรหัสที่คุณไม่ต้องผ่านรอบการอ้างอิงไปยังวัตถุที่มีมันและมีการรับประกันว่าข้อมูลที่คุณกำลังมองหาที่หรือเปลี่ยนเป็นว่าสิ่งที่ทุกคน อื่นกำลังจัดการกับไม่ใช่สำเนาของมันเป็นของอินสแตนซ์อื่นของวัตถุ
พฤติกรรมดังกล่าวมีอยู่ใน C และ C ++ ในรูปแบบของฟังก์ชันหรือตัวแปร "global" ซึ่งไม่ได้ถูกห่อหุ้มในวัตถุ ดังนั้นในการประนีประนอม C # และ Java จึงสนับสนุน "สโคปคงที่" ซึ่งเป็นจุดกึ่งกลางระหว่างรหัสสากลอย่างแท้จริงโดยไม่มีวัตถุแม่และสมาชิกอินสแตนซ์ที่มีขอบเขต จำกัด
"สมาชิกรหัส" ใด ๆ (ฟังก์ชั่น, คุณสมบัติ, เขตข้อมูล) ประกาศว่าstatic
เข้ามาในขอบเขตของบรรทัดแรกของmain()
ฟังก์ชั่นของโปรแกรมและไม่ปล่อยให้มันจนกว่าmain()
ฟังก์ชั่นจะสิ้นสุดลง ในภาษาอังกฤษล้วนมีสมาชิกแบบสแตติกอยู่และสามารถใช้งานได้ตราบใดที่โปรแกรมกำลังทำงาน นอกจากนี้สมาชิกแบบสแตติกจะถูกเรียกใช้โดยเรียกพวกเขาเป็นสมาชิกของชนิดเองไม่ใช่สมาชิกของอินสแตนซ์ประเภทใดประเภทหนึ่ง:
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
สิ่งนี้ทำให้สมาชิกสแตติกสามารถมองเห็นรหัสใด ๆ ที่มีความรู้เกี่ยวกับประเภทไม่ว่าพวกเขาจะรู้เกี่ยวกับอินสแตนซ์ใด ๆ ของมันหรือไม่
เพื่อตอบคำถามของคุณประโยชน์หลักของการทำเครื่องหมายสิ่งที่เป็นแบบสแตติกคือมันจะปรากฏให้เห็นทุกที่ที่รู้จักตัวเองโดยไม่คำนึงว่ารหัสการบริโภคมีหรือสามารถรับอินสแตนซ์ของวัตถุที่มี นอกจากนี้ยังมีประโยชน์ด้านประสิทธิภาพเล็กน้อย เนื่องจากวิธีการนั้นอยู่ในขอบเขตคงที่จึงสามารถเข้าถึงสมาชิกแบบคงที่อื่น ๆ (ของคลาสเดียวกันหรืออื่น ๆ ) และสิ่งใดก็ตามที่ถูกส่งผ่านเป็นพารามิเตอร์ ดังนั้นรันไทม์ไม่จำเป็นต้องแก้ไขการอ้างอิงใด ๆ กับอินสแตนซ์ปัจจุบันของวัตถุที่มีตามปกติมันจะต้องมีวิธีการอินสแตนซ์เพื่อให้ข้อมูลสถานะบริบทที่เฉพาะเจาะจง
คลาสทั้งหมดสามารถถูกทำเครื่องหมายแบบสแตติก โดยการทำเช่นนั้นคุณบอกคอมไพเลอร์ว่าการประกาศคลาสจะประกอบด้วยสมาชิกแบบสแตติกเท่านั้นจึงไม่สามารถสร้างอินสแตนซ์ได้ นี่เป็นวิธีที่ง่ายเพื่อให้แน่ใจว่ามีเพียงหนึ่งสำเนาเท่านั้นในวัตถุในหน่วยความจำ ทำให้คลาสและทุกอย่างในนั้นคงที่ อย่างไรก็ตามมันหายากมากที่นี่เป็นทางออกที่ดีที่สุดสำหรับความต้องการดังกล่าว ในสถานการณ์ที่จำเป็นต้องมีสำเนาชุดข้อมูลหนึ่งชุดโดยทั่วไป "ซิงเกิล" จะได้รับการสนับสนุนแทน นี่คือคลาสที่ไม่คงที่ซึ่งใช้ตัวเข้าถึงแบบคงที่และตัวสร้างแบบไม่สาธารณะเพื่อให้การเข้าถึงอินสแตนซ์เดียวของตัวเอง ในทางทฤษฎีซิงเกิลให้ประโยชน์ที่เหมือนกันของคลาสสแตติกเต็มที่ แต่ด้วยความสามารถที่เพิ่มเข้ามาเพื่อใช้คลาสในรูปแบบเชิงวัตถุเชิงวัตถุ