Her sınıfın (* .cs) bir örnek referansı olmadan içeriğine erişebilmesi için bir değişkeni nasıl tanımlayabilirim?
Yanıtlar:
İçinde C#
gerçek global değişkenleri tanımlayamazsınız (herhangi bir sınıfa ait olmadıkları anlamda).
Bununla birlikte, bu özelliği taklit etmeyi bildiğim en basit yaklaşım static class
, aşağıdaki gibi a kullanmaktan ibarettir :
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
}
Daha sonra tanımlı değerleri kodunuzun herhangi bir yerinde alabilirsiniz (aynısının parçası olması koşuluyla namespace
):
String code = Globals.CODE_PREFIX + value.ToString();
Farklı ad alanlarıyla uğraşmak için şunlardan birini yapabilirsiniz:
Globals
sınıfı belirli bir alana dahil etmeden bildirmek namespace
(böylece genel uygulama ad alanına yerleştirilecektir);namespace
.C # 'da global değişken diye bir şey yoktur. Dönem.
İsterseniz statik üyeleriniz olabilir:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
örneğin gerçekten küresel bir değişken olarak kabul edilememesinin iyi bir nedenini düşünmeye çalışıyordum .
Öncelikle, gerçekten global bir değişkene ihtiyacınız olup olmadığını, bunun yerine onu yazılım mimarinizi dikkate almadan açıkça kullanmak yerine inceleyin.
Testi geçtiğini varsayalım. Kullanıma bağlı olarak, Globals'ın yarış koşulları ve diğer birçok "kötü şey" ile hata ayıklaması zor olabilir, onlara bu kadar kötü şeylerle baş etmeye hazır olduğunuz bir açıdan yaklaşmak en iyisidir. Yani,
static
sınıfa sarın (yönetilebilirlik için).Böyle bir sınıf için temel taslak şu şekilde olacaktır:
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.
}
Diğer sınıflardan kullanım (aynı ad alanı içinde)
// Read
bool areWeAlive = Globals.Expired;
// Write
// past deadline
Globals.Expired = true;
Bunun için kullanışlı bir özellik using static
Başkalarının da söylediği gibi, globalleriniz için bir sınıf oluşturmanız gerekir:
public static class Globals {
public const float PI = 3.14;
}
Ancak sınıf adını artık statik özelliklerinin önüne yazmamak için bu şekilde içe aktarabilirsiniz:
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);