ฉันจะประกาศตัวแปรเพื่อให้ทุกคลาส (* .cs) เข้าถึงเนื้อหาได้อย่างไรโดยไม่มีการอ้างอิงอินสแตนซ์
ฉันจะประกาศตัวแปรเพื่อให้ทุกคลาส (* .cs) เข้าถึงเนื้อหาได้อย่างไรโดยไม่มีการอ้างอิงอินสแตนซ์
คำตอบ:
ในC#
คุณไม่สามารถกำหนดตัวแปรทั่วโลกที่แท้จริงได้ (ในแง่ที่ว่าพวกเขาไม่ได้เป็นของคลาสใด ๆ )
สิ่งนี้ถูกกล่าววิธีที่ง่ายที่สุดที่ฉันรู้ในการเลียนแบบคุณลักษณะนี้ประกอบด้วยการใช้ a static class
ดังนี้:
public static class Globals
{
public const Int32 BUFFER_SIZE = 512; // Unmodifiable
public static String FILE_NAME = "Output.txt"; // Modifiable
public static readonly String CODE_PREFIX = "US-"; // Unmodifiable
}
จากนั้นคุณสามารถดึงค่าที่กำหนดไว้ที่ใดก็ได้ในโค้ดของคุณ (หากเป็นส่วนหนึ่งของเดียวกันnamespace
):
String code = Globals.CODE_PREFIX + value.ToString();
ในการจัดการกับเนมสเปซที่แตกต่างกันคุณสามารถ:
Globals
ชั้นเรียนโดยไม่รวมไว้ในเฉพาะnamespace
(เพื่อที่จะวางไว้ในเนมสเปซแอปพลิเคชันส่วนกลาง)namespace
ใส่ที่เหมาะสมโดยใช้คำสั่งสำหรับการดึงตัวแปรจากที่อื่นไม่มีสิ่งที่เรียกว่าตัวแปรส่วนกลางใน C # ระยะเวลา
คุณสามารถมีสมาชิกแบบคงที่ได้หากคุณต้องการ:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
ตัวอย่างที่คุณให้มาจึงไม่สามารถพิจารณาได้ว่าเป็นตัวแปรระดับโลก
ก่อนอื่นให้ตรวจสอบว่าคุณต้องการตัวแปรส่วนกลางจริง ๆ หรือไม่แทนที่จะใช้มันอย่างโจ่งแจ้งโดยไม่คำนึงถึงสถาปัตยกรรมซอฟต์แวร์ของคุณ
สมมติว่าผ่านการทดสอบ ขึ้นอยู่กับการใช้งาน Globals อาจเป็นเรื่องยากที่จะแก้ไขข้อบกพร่องด้วยสภาพการแข่งขันและ "สิ่งเลวร้าย" อื่น ๆ อีกมากมายทางที่ดีที่สุดคือเข้าหาพวกเขาจากมุมที่คุณเตรียมพร้อมที่จะรับมือกับสิ่งเลวร้ายดังกล่าว ดังนั้น,
static
คลาส (เพื่อความสามารถในการจัดการ)โครงร่างพื้นฐานสำหรับชั้นเรียนดังกล่าวจะเป็น:
public class Globals
{
private static bool _expired;
public static bool Expired
{
get
{
// Reads are usually simple
return _expired;
}
set
{
// You can add logic here for race conditions,
// or other measurements
_expired = value;
}
}
// Perhaps extend this to have Read-Modify-Write static methods
// for data integrity during concurrency? Situational.
}
การใช้งานจากคลาสอื่น ๆ (ภายในเนมสเปซเดียวกัน)
// Read
bool areWeAlive = Globals.Expired;
// Write
// past deadline
Globals.Expired = true;
คุณสมบัติที่มีประโยชน์สำหรับสิ่งนี้คือ using static
อย่างที่คนอื่นบอกคุณต้องสร้างคลาสสำหรับลูกโลกของคุณ:
public static class Globals {
public const float PI = 3.14;
}
แต่คุณสามารถนำเข้าได้เช่นนี้เพื่อที่จะไม่เขียนชื่อคลาสไว้หน้าคุณสมบัติคงที่อีกต่อไป:
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);