首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在调用带参数的构造函数后再调用无参数的构造函数,删除我在C# MVVM中的更改?

在C# MVVM中,当调用带参数的构造函数后再调用无参数的构造函数,可能会导致你在MVVM中的更改被删除的原因是因为在调用无参数构造函数时,会重新创建一个新的实例,从而丢失了之前的更改。

MVVM(Model-View-ViewModel)是一种软件架构模式,用于将用户界面(View)与业务逻辑(ViewModel)和数据(Model)分离。在MVVM中,ViewModel负责处理用户界面的交互逻辑和数据绑定,而View则负责展示和响应用户操作。

当你调用带参数的构造函数时,通常是为了传递一些初始化参数给ViewModel,以便在创建ViewModel实例时进行一些初始化操作。但是,如果在之后又调用了无参数的构造函数,就会重新创建一个新的ViewModel实例,而丢失了之前的更改。

为了避免这种情况发生,你可以考虑以下几种解决方案:

  1. 在无参数的构造函数中,判断是否已经存在ViewModel实例,如果存在则不重新创建。可以使用静态变量或单例模式来保存ViewModel实例。
  2. 在带参数的构造函数中,将传递的参数保存到ViewModel中,并在无参数的构造函数中使用这些参数进行初始化操作,而不是重新创建一个新的实例。
  3. 使用依赖注入(Dependency Injection)框架,如Unity、Autofac等,来管理ViewModel的创建和依赖关系。通过配置依赖注入容器,可以确保只有一个ViewModel实例被创建,并且可以在不同的地方使用相同的实例。

总之,在调用带参数的构造函数后再调用无参数的构造函数时,需要注意是否会导致重新创建ViewModel实例,从而丢失之前的更改。根据具体的情况,选择合适的解决方案来避免这个问题的发生。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体引擎(GME):https://cloud.tencent.com/product/gme
  • 腾讯云音视频处理(VOD):https://cloud.tencent.com/product/vod
  • 腾讯云网络安全(DDoS防护、Web应用防火墙等):https://cloud.tencent.com/product/ddos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Groovy】Groovy 方法调用 ( Groovy 构造函数为成员赋值 | Groovy 函数参数传递与键值对参数 | 完整代码示例 )

文章目录 一、Groovy 构造函数为成员赋值 二、Groovy 函数参数传递与键值对参数 三、完整代码示例 一、Groovy 构造函数为成员赋值 ---- Groovy 类没有定义构造函数 ,...但是可以使用如下形式构造函数 , 为 Groovy 类设置初始值 ; new 类名(成员名1: 成员值1, 成员名2: 成员值2) 顺序随意 : 成员顺序随意 , 没有强制要求 , 只需要 成员名..., ${student3.age}" 执行结果为 : student : Tom , 18 student2 : Jerry , 16 student3 : Jim , null 二、Groovy 函数参数传递与键值对参数...---- Groovy 构造函数 , 可以使用 成员名1: 成员值1, 成员名2: 成员值2 类型参数 , 这是键值对 map 类型集合 ; 但是对于普通函数 , 不能使用上述格式 ,...; 必须使用如下形式 , 才能正确执行 printValue 函数 ; // 传入 a: "Tom", b: 18 是第一个参数 , 这是一个 map 集合 // 第二个参数是 "Jerry" 字符串

9.1K20

vue面试题+答案,2021前端面试

MVVM 与 MVC 最大区别就是:它实现了 View 和 Model 自动同步,也就是当 Model 属性改变时,我们不用自己手动操作 Dom 元素,来改变 View 显示,而是改变属性该属性对应...为什么vue组件data必须是一个函数?...diff算法优化策略:四种命中查找,四个指针 旧前与新前(先比开头,插入和删除节点这种情况) 旧与新(比结尾,前插入或删除情况) 旧前与新(头与尾比,此种发生了,涉及移动节点,那么新前指向节点...key 是为 Vue vnode 唯一标记,通过这个 key,我们 diff 操作可以更准确、更快速 更准确:因为 key 就不是就地复用了, sameNode 函数 a.key === b.key...调用全局 afterEach 钩子。 触发 DOM 更新。 调用 beforeRouteEnter 守卫传给 next 回调函数,创建好组件实例会作为回调函数参数传入。

1.3K00

c#结构体与类区别,及使用技巧 C#结构体与类区别

首先,关于隐式构造函数.我们知道,1个类如果我们没有为类写任意构造函数,那么C#编译器在编译时候会自动为这个类生成1个参数构造函数.我们将这个构造函数称之为隐式构造函数 但是一旦我们为这个类写了任意...结构,就不是这样了,结构隐式构造函数无论如何都存在.看看代码吧. 在下面的代码 我们为结构体写了1个参数构造函数.如下. ?...我们使用new关键字来创建结构体对象,我们发现调用构造函数时候,提示是有两个构造函数.多了1个参数构造函数. ? 那么 我们再想,能不能手动写1个参数构造函数呢?...我们怀着无比激动心情,试一下. ? 结果是华丽丽报错了.所以我们得出结论. 隐式参数构造函数结构无论如何都是存在,所以程序员不能手动为结构添加1个参数构造函数....所以,我们不难猜出.结构体参数构造函数做了什么事情,参数构造函数为所有的字段赋值,值类型字段赋值0,给引用类型字段赋值null. d.

1.1K32

C#简单面试题目(三)

31.C#提供一个默认构造函数,当我实现了另外一个有一个参数构造函数时,还想保留这个参数构 造函数。这样应该写几个构造函数?     ...两个,一旦你实现了一个构造函数C#就不会提供默认构造函数了,所以需要手动实现那个构造函数。 32.const和readonly有什么区别?...委托可以理解为指向一个函数引用。   是的,是一种特殊委托。 39.C#堆与栈   栈(stack)由系统管理生存期,存储代码执行和调用路径,执行或调用完毕即从栈清除。   ...堆(Heap)中保存值和对象,调用完毕之后依然存在,由垃圾回收器查找栈中有无指向该值或对象引用,则从堆删除 40.对泛型了解,和简单说明一下泛型有什么好处?    ...为什么?   强类型是在编译时候就确定类型数据,执行时类型不能更改,而弱类型执行时候才会确定类型。没有 好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。

95210

C#结构体与类区别

首先,关于隐式构造函数.我们知道,1个类如果我们没有为类写任意构造函数,那么C#编译器在编译时候会自动为这个类生成1个参数构造函数.我们将这个构造函数称之为隐式构造函数 但是一旦我们为这个类写了任意...结构,就不是这样了,结构隐式构造函数无论如何都存在.看看代码吧. 在下面的代码 我们为结构体写了1个参数构造函数.如下. ?...我们使用new关键字来创建结构体对象,我们发现调用构造函数时候,提示是有两个构造函数.多了1个参数构造函数. ? 那么 我们再想,能不能手动写1个参数构造函数呢?...我们怀着无比激动心情,试一下. ? 结果是华丽丽报错了.所以我们得出结论. 隐式参数构造函数结构无论如何都是存在,所以程序员不能手动为结构添加1个参数构造函数....所以,我们不难猜出.结构体参数构造函数做了什么事情,参数构造函数为所有的字段赋值,值类型字段赋值0,给引用类型字段赋值null. d.

1.4K31

.NET面试题系列 - C# 基础知识(1)

如果类型对象已经存在,则不会再次调用静态构造函数调用类型实例初始化器,初始化类型非静态成员。 例如下面的代码C#首先将a初始化为5,然后修改成10。...当我们创建了某个引用类型实例复制一个新时,将只会复制指针。例如: A a = new A(); A a2 = a; 此时只有一个A实例,而a和a2都指向它。...如果类型没有定义任何构造函数,则编译器将定义一个没有参数构造函数。其会简单地调用基类构造函数。特别的,由于System.Object没有任何实例字段,所以它构造函数什么也不做。...不能显式地为结构声明参数构造函数。...如果我们不了解堆上内存分配方式,对静态构造函数理解会十分困难。为什么创建第一个实例之前?为什么不能直接调用为什么不能有参数?我们完全无法理解,只能通过死记硬背方式记住这些性质。

1.8K20

C#类学习-3

C#构造函数 构造函数创建给定类型对象时执行类方法。 构造函数具有与类相同名称,它通常初始化新对象数据成员。...除非类是 static ,否则 C# 编译器将为构造函数类提供一个公共默认构造函数,以便该类可以实例化。...构造函数可以使用 base 关键字来调用基类构造函数。 基类构造函数执行构造函数块之前被调用。 base 关键字可参数使用,也可不带参数使用。...构造函数任何参数都可用作 base 参数 如果基类没有提供默认构造函数,派生类必须使用 base 显式调用构造函数构造函数可以使用 this 关键字调用同一对象另一构造函数。...和 base 一样,this 可参数使用也可不带参数使用,构造函数任何参数都可用作 this 参数 构造函数可以标记为 public、private、protected、internal 或 protectedinternal

47620

C#-构造函数

除非类是静态,否则C#编译器将自动为构造函数类提供一个公共构造函数。 可以通过将构造函数设置为私有构造函数,阻止类被实例化。...结构(struct)类型构造函数和类构造函数类似,但是structs不包含显示构造函数,编译器会自动提供一个显示构造函数。只有使用new实例化struct时,才会调用参数构造函数。...base关键字可参数使用,也可不带。构造函数任何参数都可以作base参数,或用作表达式一部分。...派生类如果不适用base关键字来显示调用基类构造函数,则将调用隐式参数构造函数(在有的情况下 )。 如果基类没有提供构造函数,派生类必须使用base显示调用基类构造函数。...构造函数可以使用this调用同一对象另一个构造函数。和base一样,this可参数使用也可以不带参数使用。

73910

一道关于实例化顺序C#面试题,有点难度

类型构造器(静态构造函数执行时间。 C#基类和子类实例化顺序。 new修饰符作用。...,编译器会首先生成内联方式代码,然后调用构造函数。...m_x = 10; } } 类型构造执行 所谓类型构造器也就是我们熟知静态构造方法,我们编写,都会有一个默认静态构造方法,跟参实例构造方法一样是默认存在。...这里可以看出,当第一次实例化某个类时,会首先调用该类静态构造方法。 C#基类和子类实例化顺序 这个知识点比较简单,那就是调用子类实例构造方法之前会调用基类实例构造方法。...个人理解比较简单:当子类,一个方法签名(指参数,方法名,返回值)与基类一个方法相同,通过加入new修饰符,可以让子类不做更改去使用该方法。

16540

耽误你十分钟,让MVVM原理还给你

时间嘀嗒嘀嗒走着 既然来了就继续看看吧 这篇文章其实没有什么鸟用,只不过对于现在前端面试而言,已经是一个被问烦了考点了 既然是考点,那么就想简简单单来给大家划一下重点 众所周知当下是MVVM...+发布订阅模式 真正实现其实靠也是ES5提供Object.defineProperty,当然这是不兼容所以Vue等只支持了IE8+ 为什么是它 Object.defineProperty()说实在我们大家开发确实用不多...,相信用过Vue同学并不陌生 那么现在就开始实现一个自己MVVM吧 打造MVVM // 创建一个Mvvm构造函数 // 这里用es6方法将options赋一个初始值,防止没传,等同于options...$el.appendChild(fragment); // 再将文档碎片放入el } 看到这里面试已经可以初露锋芒了,那就一鼓作气,做事做全套,来个一条龙 现在数据已经可以编译了,但是我们手动修改数据并没有页面上发生改变...= txt.replace(reg, val).trim(); // 监听变化 // 给Watcher添加两个参数,用来取新值(newVal)给回调函数传参 + new Watcher

1.1K30

类和对象 _ 剖析构造、析构与拷贝

对象实例化时编译器自动调用对应构造函数构造函数可以重载。 构造 构造函数允许我们创建Date对象而不提供任何参数。...private: int _year; int _month; int _day; }; 构造 构造可以和构造函数重载,因为之后调用时候不会受影响...然而,一旦你为类显式定义了任何构造函数(无论是参还是参),编译器就不会自动生成默认构造函数了。...main函数拷贝传参时候 MyClass newObj = obj相当于将obj作为参数传入拷贝构造函数,其main对应格式为类 = 类所以调用了拷贝构造。...函数创建了一个对象并进行返回,但是函数结束也就出了st域,所以会调用Stack析构函数对st进行析构,从而导致之前返回那个值变为了析构结果,然后返回那个值出了它域之后又会进行一次析构

10110

Only 10 分钟,给你圈出 MVVM 原理重难点

真正实现其实靠也是ES5提供Object.defineProperty,当然这是不兼容所以Vue等只支持了IE8+ 为什么是它 Object.defineProperty()说实在我们大家开发确实用不多...,相信用过Vue同学并不陌生 那么现在就开始实现一个自己MVVM吧 打造MVVM // 创建一个Mvvm构造函数 // 这里用es6方法将options赋一个初始值,防止没传,等同于options...// 创建Compile构造函数 function Compile(el, vm) { // 将el挂载到实例上方便调用 vm....$el.appendChild(fragment); // 再将文档碎片放入el } 看到这里面试已经可以初露锋芒了,那就一鼓作气,做事做全套,来个一条龙 现在数据已经可以编译了,但是我们手动修改数据并没有页面上发生改变...= txt.replace(reg, val).trim(); // 监听变化 // 给Watcher添加两个参数,用来取新值(newVal)给回调函数传参 + new Watcher

61410

【JS】508- MVVM原理介绍

真正实现其实靠也是ES5提供Object.defineProperty,当然这是不兼容所以Vue等只支持了IE8+ 为什么是它 Object.defineProperty()说实在我们大家开发确实用不多...,相信用过Vue同学并不陌生 那么现在就开始实现一个自己MVVM吧 打造MVVM // 创建一个Mvvm构造函数 // 这里用es6方法将options赋一个初始值,防止没传,等同于options...// 创建Compile构造函数 function Compile(el, vm) { // 将el挂载到实例上方便调用 vm....$el.appendChild(fragment); // 再将文档碎片放入el } 看到这里面试已经可以初露锋芒了,那就一鼓作气,做事做全套,来个一条龙 现在数据已经可以编译了,但是我们手动修改数据并没有页面上发生改变...= txt.replace(reg, val).trim(); // 监听变化 // 给Watcher添加两个参数,用来取新值(newVal)给回调函数传参 + new Watcher

1K40

java开发人员最常犯10种错误

如果在循环过程调用remove(),调用next(),就会导致异常ConcurrentModificationException。原因如上。...九、父类和子类构造函数 上图代码中有两处编译时错误,原因其实很简单,主要和构造函数有关。首先,我们都知道: 如果一个类没有定义构造函数,编译器将会插入一个参数默认构造函数。...如果一个类定义了一个参数构造函数,那么编译器就不会帮我们创建构造函数。 上面的Super类定义了一个参数构造函数。编译器将不会插入默认参数构造函数。...我们还应该知道: 子类所有构造函数(无论是有参还是参)执行时,都会调用父类构造函数。 所以,编译器试图调用Super类构造函数。...要解决这个问题,可以简单通过 1)父类添加一个Super()构造方法,就像这样: public Super(){} 2)移除自定义父类构造函数 3)子类构造函数调用父类super(value

12810

C#学习基础之一——面向对象编程及new用法总结

所谓面向对象编程,个人理解是,我们只用对象去实现我们功能,这样可以很容易达到重复利用。过去用C编程时,我们要用重复代码,首先考虑到肯定是声明一个函数来封装,使用时调用即可。...创建对象时调用方法。它名字是和类名一样。默认构造函数是不带参数,也没有其他逻辑内容,并且隐藏起来,就是你创建一个类时,不会显示构造函数。   ...还可以重载构造函数,即声明参数构造函数,比如声明一个服装构造函数,有一个参数参数类型为sting,用来定义这个服装面料。   ...,所以只能重载一个构造函数。...  如 声明了一个函数 void Eat(Animal myAnimal),它参数是Animal类型,调用是可以这样子Eat(new Animal); 2.也用于为值类型调用默认构造函数   例:

86021

深入类方法

一.C#关键字扩充解释:   1. new :     1)开辟空间     2)调用构造     3)实例化对象   2. this:     当前类实例,用来区分入参和成员变量   3.  ...    注:不能将构造函数定义为void       根据普遍经验,我们进行开发时,一般不在构造函数中进行类初始化以外事情,不要尝试显示地调用构造函数   2.构造     语法:   ...访问修饰符 类名() { //方法体 }     代码示例: public Book() { }   3.构造函数     语法: 访问修饰符...    没有手动编写构造时,系统会给我们自动生成一个构造     为什么系统要自动生成构造?             ...      同一个类     需要注意,方法名及参数列表相同方法,仅是返回值类型不同,不能称为方法重载 public void Say() { } public string

71570

C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

利用反编译工具可以知道使用自动实现属性时,C#都会帮我们创建必要字段. 另外在结构体中使用自动属性时, 需要注意是所有构造函数都需要显式地调用构造函数this, 否则会出现编译错误....然而, 类却不需要显式地调用构造函数, 这主要是由C#编译器设计决定, 我们记住就好了. 1 public struct TestPerson 2 { 3 public string...由此可以想到,要使用对象初始化器,则必须保证类具有一个构造函数. 如果我们自定义了一个有参构造函数而把默认构造函数覆盖了, 则需要重新定义一个构造函数....解释上面代码打印结果由来: 以上代码存在另个不同命名空间, 它们都定义了一个参数扩展方法Print....此时CurrentNameSpace命名空间下, 正好存在一个扩展类型参数Print扩展方法, 编译器因此不会继续查找其他引入命名空间了.

805100

C# 12 中新增八大功能你都知道吗?

一、主构造函数 Visual Studio 2022 版本 17.6 预览版 2 引入。 从 C# 12 开始,可以类和结构声明主构造函数。主构造函数参数都在类整个主体范围内。...为了确保显式分配所有主构造函数参数,所有显式声明构造函数都必须使用 this() 语法调用构造函数。将主构造函数添加到 class 可防止编译器声明隐式参数构造函数。... struct ,隐式参数构造函数初始化所有字段,包括 0 位模式构造函数参数。 主构造函数参数最常见用途包括: 作为 base() 构造函数调用参数。 初始化成员字段或属性。...引用实例成员构造函数参数。...拦截器可以向编译(例如在源生成器)添加新代码,从而提供更改现有代码语义有限能力。 注意:拦截器是一项试验性功能, C# 12 预览模式下提供。

18110
领券