gpt4 book ai didi

c# - Singleton:如何第一次实例化 Singleton?

转载 作者:行者123 更新时间:2023-11-30 23:11:48 26 4
gpt4 key购买 nike

我有这个单例类:

public class Utente
{
private static readonly Lazy<Utente> lazy =
new Lazy<Utente>(() => new Utente());

public static Utente Instance
{
get
{
return lazy.Value;
}
set
{

}
}

public string name { get; set; }
public string lastname { get; set; }
public int id { get; set; }
public int issuperuser { get; set; }
public string persontype { get; set; }
public int idpersontype { get; set; }
public string token { get; set; }
public string[] permissions { get; set; }
public List<Mese> mese { get; set; }
}

而且我需要第一次实例化惰性。我怎么做?我需要第一次实例化该类,以便将其保存在整个程序的其余部分。

现在我需要在这个类中使用它:

Utente u = new Utente();
WebRequest richiesta = (HttpWebRequest)WebRequest.Create(URL);
WebResponse risposta = (HttpWebResponse)CreateLoginRequest(richiesta).GetResponse();
StreamReader dati = new StreamReader(risposta.GetResponseStream());
string output = dati.ReadToEnd();
u = JsonConvert.DeserializeObject<Utente>(output);
risposta.Close();

Utente() 是否正确,还是我应该使用其他代码?编辑:

Utente u = new Utente();
WebRequest richiesta = (HttpWebRequest)WebRequest.Create(URL);
WebResponse risposta = (HttpWebResponse)CreateLoginRequest(richiesta).GetResponse();
StreamReader dati = new StreamReader(risposta.GetResponseStream());
string output = dati.ReadToEnd();
u = JsonConvert.DeserializeObject<Utente>(output);
risposta.Close();

Utente 类只需要实例化一次,这样我就可以在所有程序中使用该值。那么为什么我在另一个类(class)这样做:`

if (verifica && (Utente.Instance.persontype == "Datore")) 

Utente.Instance.persontype 结果为空?

最佳答案

第一个问题:您没有通过公共(public)构造函数禁用 Utente 类实例创建。您的第一行代码创建了一个新实例:

Utente u = new Utente();

正如其他人已经提到的,您必须禁止在此类之外创建单例类的新实例。将构造函数设为私有(private):

private Utente() { }

现在是第二个问题 - 您想要使用 Newtonsoft JSON 反序列化器填充单例的属性。 即使构造函数是私有(private)的,反序列化器也会在您每次反序列化某些字符串时创建一个 Utrente 类的新实例:

var newInstance = JsonConvert.DeserializeObject<Utente>(output); // 'output' is json string

所以你不应该使用DeserializeObject 方法。你应该使用 PopulateObject方法并传递已存在的单例实例以由 Newtonsoft JSON 填充:

JsonConvert.PopulateObject(output, Utente.Instance); 

小提示 - 你不需要 set 方法来获取单例的 Instance 属性。使用 C# 6 Expression-Bodied 成员,您可以将此属性简化为:

public static Utente Instance => lazy.Value;

关于c# - Singleton:如何第一次实例化 Singleton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44497878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com