看书发现以前写的单例类好复杂,原来这么简单就可以了

OrdinaryCoder 码农  2019-04-26 03:15:53

public class Manager
{
private static Manager instance;
static Manager()
{
instance = new Manager();
}
public static Manager GetInstance()
{
return instance;
}
}
...全文
479 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
OrdinaryCoder 2019-04-28
引用 10 楼 qq_39231899的回复:
积分到底怎么得啊新手好难啊,根本没法下载东西
下载分需要你上传程序 然后有人下载
回复
inspur_辰东 2019-04-28
积分到底怎么得啊新手好难啊,根本没法下载东西
回复
闭包客 2019-04-28
是的,这就是简单的单例,即使在很多正式环境中都够用了。
回复
xiaoxiangqing 2019-04-28
容易复杂都是相对的
回复
weixin_44990501 2019-04-28
学习
回复
OrdinaryCoder 2019-04-26
引用 8 楼 bloodish 的回复:
[quote=引用 3 楼 OrdinaryCoder 的回复:]
[quote=引用 2 楼 bloodish 的回复:]

public abstract class Singleton<T>
{
static Lazy<T> lazyT;
static Singleton() => lazyT = new Lazy<T>();
public static T Instance => lazyT.Value;
}

VS的原因吗 我用13跑不了你的代码[/quote]

C#6.0的表达式方法体的写法,VS2013不支持,不过好像有第三方的解决方案,可以自己找一下。

我这个写法也不是最恰当的,
首先T可能需要再加点泛型约束;
其次因为这个写法要求Singleton的子类有public的缺省构造函数,这点其实有违单例的设计准则。

不用泛型单例抽象基类的话,下面这个写法你可以参考使用(sealed class, private ctor, lazy init, thread safe, etc.)


public sealed class MySingleton
{
static Lazy<MySingleton> lazyT;
static MySingleton() => lazyT = new Lazy<MySingleton>();
MySingleton() { }
public static MySingleton Instance => lazyT.Value;
}

[/quote]
好的 谢谢了
回复
bloodish 2019-04-26
引用 3 楼 OrdinaryCoder 的回复:
[quote=引用 2 楼 bloodish 的回复:]

public abstract class Singleton<T>
{
    static Lazy<T> lazyT;
    static Singleton() => lazyT = new Lazy<T>();
    public static T Instance => lazyT.Value;
}
VS的原因吗 我用13跑不了你的代码[/quote] C#6.0的表达式方法体的写法,VS2013不支持,不过好像有第三方的解决方案,可以自己找一下。 我这个写法也不是最恰当的, 首先T可能需要再加点泛型约束; 其次因为这个写法要求Singleton的子类有public的缺省构造函数,这点其实有违单例的设计准则。 不用泛型单例抽象基类的话,下面这个写法你可以参考使用(sealed class, private ctor, lazy init, thread safe, etc.)

    public sealed class MySingleton
    {
        static Lazy<MySingleton> lazyT;
        static MySingleton() => lazyT = new Lazy<MySingleton>();
        MySingleton() { }
        public static MySingleton Instance => lazyT.Value;
    }
回复
OrdinaryCoder 2019-04-26
引用 6 楼 exception92 的回复:
[quote=引用 5 楼 exception92 的回复:]
单例的写法有好几种了。使用static 构造确实够简单,因为构造只执行一次。

但是不是线程安全的,想确保线程安全分别了解用户模式,内核模式下不同的线程安全方式。[/quote]
哦哦 好的 我看一下
回复
exception92 2019-04-26
引用 5 楼 exception92 的回复:
单例的写法有好几种了。使用static 构造确实够简单,因为构造只执行一次。
但是不是线程安全的,想确保线程安全分别了解用户模式,内核模式下不同的线程安全方式。
回复
exception92 2019-04-26
单例的写法有好几种了。使用static 构造确实够简单,因为构造只执行一次。
回复
OrdinaryCoder 2019-04-26
引用 1 楼 wanghui0380 的回复:
线程呢????????????????

!!!!!!!!!!!!!!!!!

想简单可以,lazy学学先。不然还是老老实实的写

额 没太理解你说的是什么意思 可能之前没用到过 可以稍微解释一下吗
回复
OrdinaryCoder 2019-04-26
引用 2 楼 bloodish 的回复:

public abstract class Singleton<T>
{
static Lazy<T> lazyT;
static Singleton() => lazyT = new Lazy<T>();
public static T Instance => lazyT.Value;
}

VS的原因吗 我用13跑不了你的代码
回复
bloodish 2019-04-26

public abstract class Singleton<T>
{
    static Lazy<T> lazyT;
    static Singleton() => lazyT = new Lazy<T>();
    public static T Instance => lazyT.Value;
}
回复
wanghui0380 2019-04-26
线程呢???????????????? !!!!!!!!!!!!!!!!! 想简单可以,lazy学学先。不然还是老老实实的写
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2019-04-26 03:15
社区公告

让您成为最强悍的C#开发者