我需要储存一系列需要在全球获得的变量,我很想知道单一州模式是否适用。 从我所看到的例子来看,单一州模式只是一个可以继承的静态类别。 但我所看到的例子对我的需求来说过于复杂。 最简单的单一州类别是什么? 难道我只是一个静态、密封的类别,其中有一些变量?
What is the use of default keyword in C#? Is it introduced in C# 3.0 ?
我需要储存一系列需要在全球获得的变量,我很想知道单一州模式是否适用。 从我所看到的例子来看,单一州模式只是一个可以继承的静态类别。 但我所看到的例子对我的需求来说过于复杂。 最简单的单一州类别是什么? 难道我只是一个静态、密封的类别,其中有一些变量?
通常情况下是单一吨sn t。 a 固定类别——单一吨将给你一个等级的instance。
我不知道你看到哪些例子,但通常情况下,singleton patterns在C#中确实简单:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
static Singleton() {} // Make sure it s truly lazy
private Singleton() {} // Prevent instantiation outside
public static Singleton Instance { get { return instance; } }
}
这并不困难。
单吨对静态成员的优势是,这一类别能够实施接口等。 有时,这种情况是有益的,但有时,静态成员也确实如此。 此外,从单一州到非单一州通常比较容易,例如,在单一州作为“组合”反对依赖等级,而不是那些直接静态电话的依赖等级。
我个人设法尽可能避免使用单一州,除了别的以外,它们使检测更加困难。 有时它们可能有用。
有几个模式可能适合你,一个单一州是更糟糕的。
<>Registry
struct Data {
public String ProgramName;
public String Parameters;
}
class FooRegistry {
private static Dictionary<String, Data> registry = new Dictionary<String, Data>();
public static void Register(String key, Data data) {
FooRegistry.registry[key] = data;
}
public static void Get(String key) {
// Omitted: Check if key exists
return FooRegistry.registry[key];
}
}
<>Static Level
class GlobalStuff {
public static String ProgramName {get;set;}
public static String Parameters {get;set;}
private GlobalStuff() {}
}
<>光度>
class DataSingleton {
private static DataSingleton instance = null;
private DataSingleton() {}
public static DataSingleton Instance {
get {
if (DataSingleton.instance == null) DataSingleton.instance = new DataSingleton();
return DataSingleton;
}
}
}
我个人喜欢书记官处模式,但YMMV。
你们应当研究依赖性注射,因为它通常被认为是最佳做法,但太大了在这里解释的话题:
http://en.wikipedia.org/wiki/Dependency_Injection”rel=“nofollow noreferer”>Dependency Injection
单一州只剩下可以继承的固定等级。 它是一个正常的班级,只能一度进行即时处理,人人都可以分享这一单一案例(使它变得安全得多)。
独一州典型的网络代码像如下。 这是一个快速的例子,并非通过任何手段执行最佳或可读安全守则:
public sealed class Singleton
{
Singleton _instance = null;
public Singleton Instance
{
get
{
if(_instance == null)
_instance = new Singleton();
return _instance;
}
}
// Default private constructor so only we can instanctiate
private Singleton() { }
// Default private static constructor
private static Singleton() { }
}
如果你重新走下你重新思考的道路,一个静态的密封的班子将只做罚款。
采用C第6号自动-财产启动器。
public sealed class Singleton
{
private Singleton() { }
public static Singleton Instance { get; } = new Singleton();
}
简明扼要——我很乐于听下台。
我知道这个问题是老的,但这里是另一个使用4.Net(包括网络核心和网络标准)的解决办法。
第一,界定你们的等级,将变成一个单一州:
public class ClassThatWillBeASingleton
{
private ClassThatWillBeASingleton()
{
Thread.Sleep(20);
guid = Guid.NewGuid();
Thread.Sleep(20);
}
public Guid guid { get; set; }
}
在“第一”类例中,对一名睡觉的建筑商进行了定义,然后制作一部新的指南,将其公有财产排除在外。 (睡仅作一致测试)
通知说,施工者是私人的,因此没有人能够提出这一类别的新案例。
现在, 我们需要确定将这一类变为单一吨的包装:
public abstract class SingletonBase<T> where T : class
{
private static readonly Lazy<T> _Lazy = new Lazy<T>(() =>
{
// Get non-public constructors for T.
var ctors = typeof(T).GetConstructors(System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic);
if (!Array.Exists(ctors, (ci) => ci.GetParameters().Length == 0))
throw new InvalidOperationException("Non-public ctor() was not found.");
var ctor = Array.Find(ctors, (ci) => ci.GetParameters().Length == 0);
// Invoke constructor and return resulting object.
return ctor.Invoke(new object[] { }) as T;
}, System.Threading.LazyThreadSafetyMode.ExecutionAndPublication);
public static T Instance
{
get { return _Lazy.Value; }
}
}
通知说,它使用拉齐创建“外地代码”——Lazy,该编码知道如何用它作为私人建筑商对某类进行即时处理。
并且界定了一条“财产编码”
通知<代码>LazyThreadSafetyMode 输往拉齐的建筑商。 正在使用<代码>ExecutionAndPublication。 因此,只有一条路子才能开始拉齐地区的价值。
现在,我们必须做的是确定一个单一州:
public class ExampleSingleton : SingletonBase<ClassThatWillBeASingleton>
{
private ExampleSingleton () { }
}
这里是使用的一个例子:
ExampleSingleton.Instance.guid;
还有一个检验标准,就是说两条镜子会得到单一州同样的检查:
[Fact()]
public void Instance_ParallelGuid_ExpectedReturnSameGuid()
{
Guid firstGuid = Guid.Empty;
Guid secondGuid = Guid.NewGuid();
Parallel.Invoke(() =>
{
firstGuid = Singleton4Tests.Instance.guid;
}, () =>
{
secondGuid = Singleton4Tests.Instance.guid;
});
Assert.Equal(firstGuid, secondGuid);
}
这一检验标准同时称为拉齐地区的价值,我们要说,从这一财产(Lazy的Value)中归还的两种情况相同。
关于这一主题的更多详情,见:http://csharpin deep.com/Articles/General/Singleton.aspx”rel=“nofollow noreferer”>。 C# in Depth
就我而言,这是在C#中最简明扼要地实施单一州模式。
http://blueonionsoftware.com/blog.aspx?p=c6e72c38-2839-4696-990a-3fbf9b2b0ba4
然而,我建议,单一州是真正的丑恶模式...... 我认为他们是一位反家长。
对我来说,我更喜欢像一个保存人,执行《保存人》。 您的班子可以宣布附属于建筑商的保存机构,并且可以采用依赖性注射或一种方法:
Use your language features. Mostly simple thread-safe implementation is:
public sealed class Singleton
{
private static readonly Singleton _instance;
private Singleton() { }
static Singleton()
{
_instance = new Singleton();
}
public static Singleton Instance
{
get { return _instance; }
}
}
还有一种可能的解决办法。 我认为,最简单、最直截了当、最容易使用的方法就是这样:
//The abstract singleton
public abstract class Singleton<T> where T : class
{
private static readonly Lazy<T> instance = new Lazy<T>( CreateInstance, true );
public static T Instance => instance.Value;
private static T CreateInstance()
{
return (T)Activator.CreateInstance( typeof(T), true);
}
}
//This is the usage for any class, that should be a singleton
public class MyClass : Singleton<MyClass>
{
private MyClass()
{
//Code...
}
//Code...
}
//Example usage of the Singleton
class Program
{
static void Main(string[] args)
{
MyClass clazz = MyClass.Instance;
}
}
What is the use of default keyword in C#? Is it introduced in C# 3.0 ?
I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...
I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...
I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...
I have two EF entities. One has a property called HouseNumber. The other has two properties, one called StartHouseNumber and one called EndHouseNumber. I want to create a many to many association ...
How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...
Since I cannot order my dictionary, what is the best way of going about taking key value pairs and also maintaing an index?
Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...