我想在分类后填充拆分位置.

 public class UserProfile{
        
        public int SplitterPosition { get; set; }

        public static readonly UserProfile Default = new UserProfile();

        public const string FileName = "UserProfileSettings.json";

        public UserProfile()
        {
            SplitterPosition = 313;
        }

        public static void Load()
        {
            if (File.Exists(Path.Combine(ProfileDirectory, FileName)))
            {
                UserProfile user = RoboostSerializer.DeserializeObject<UserProfile>(File.ReadAllText(Path.Combine(RoBoost.Common.FileSystemConstants.ProfileDirectory, FileName)));

                Default.SplitterPosition = user.SplitterPosition;

            }
        }

        public static void Save()
        {
           string serialized = RobotSerializer.SerializeObject(Default);

            if (File.Exists(Path.Combine(ProfileDirectory, FileName)))
            {
                File.WriteAllText(Path.Combine(ProfileDirectory, FileName), serialized);
            }
        }
    }

如下所示调用Load方法

UserProfile.Load();

但我不知道如何分配props 而不重置其值

推荐答案

有了更新的代码,看起来你真正想问的是:

我们是否可以对现有对象进行就地串行化,并让序列化器为该对象赋值?

这个问题取决于正在使用的特定序列化程序(我们看不到),但usually答案是简单的"否";大多数序列化程序不支持这种用例(有些支持).看起来您正在使用JSON,而两个最有可能的JSON序列化器(Newtonsoft和STJ)都不支持就地反序列化AFAIK.实际上,这并不存在问题,正如您所能做到的:

  1. 手动复制属性,如您所做的
  2. 进行对象交换,即Whatever = user;

第二种方法更可取,因为它可以原子地执行这项操作--这意味着:永远不会出现这样的假设情况(通常涉及多个线程),即一个实例在损坏状态下被观察到,其中它具有来自旧数据/传出数据的some个值,以及来自新数据/传入数据的some other个值--这可能是危险的,并且会导致无效操作.所以,102,我的建议是go 掉readonly,只做Default = user;.

然而(警告)!我very关心:

public static readonly UserProfile Default = new UserProfile();

这种static的用法需要仔细考虑very,通常是一个坏主意.它在单用户应用程序中是broadly tolerable,例如桌面GUI应用程序,但在服务器应用程序中是wildly不合适的,例如Web服务器.即使在单个用户应用中,为了避免混合状态问题,任何使用都需要捕获实例once only,即,而不是:

Write("User: " + UserProfile.Default.Id);
Write("User: " + UserProfile.Default.Name);

你需要:

var user = UserProfile.Default;
Write("User: " + user.Id);
Write("User: " + user.Name);

当您判断所有现有代码的时候(记住,在future 的代码更改中继续判断),它是less工作简单地pass in适当的用户,而不是环境状态.它也可能是acceptable,稍微改变它是一个方法,而不是一个属性/字段:

var user = UserProfile.GetDefaultUser();
Write("User: " + user.Id);
Write("User: " + user.Name);

这里的意义在于,as a method英镑"感觉"更贵,也就是说,你不应该重复做一些事情;如果是less likely英镑,你就会发现:

Write("User: " + UserProfile.GetDefaultUser().Id);
Write("User: " + UserProfile.GetDefaultUser().Name);

仅仅是因为GetDefaultUser()个"看起来"合适昂贵,大多数人会认为快照返回值一次.不过,这是not reliable,人们经常编写明显低效的代码,所以我不会依赖于将其更改为一种防止混合状态的完美方法.

Csharp相关问答推荐

ß != ss与ICU进行不区分大小写的比较

自定义JsonEditor,用于将SON序列化为抽象类

禁用AutoSuggestBox项目更改时的动画?

将修剪声明放入LINQ中

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

一小时后,自定义缓存停止在App Insight中保存

如何从HttpContext获取请求正文

Azure Redis缓存与Entra ID身份验证

Appsettings.json未加载.Net 8 Blaazor Web程序集

获取具有AutoFaces的所有IOptions对象的集合

将类移动到新命名空间后更新RavenDB Raven-Clr-Type

正在寻找新的.NET8 Blazor Web应用程序.如何将.js添加到.razor页面?

Azure Functions v4中的Serilog控制台主题

正在从最小API-InvocationConext.Arguments中检索参数的FromBodyAttribute

JSON串行化程序问题.SQLite中的空值

如何在使用属性 Select 器时判断是否可以为空

将两个for循环更改为一条LINQ语句

在C#和HttpClient中使用REST API

Xamarin Forms应用程序中登录页面的用户名和密码编辑文本之间不需要的空格

如何提高C#中比较大 struct 的性能?