这种情况构造函数是否会执行?

jhdxhj 2020-07-14 11:31:47
List<A> _As;
_As = _DbCnn.Query<A>(sql).ToList();//这里是数据库查询出来的集合

对象A有一个构造函数
public A()
{
_B = new B();
}
请问 _As = _DbCnn.Query<A>(sql).ToList(); 这里赋值的时候,对象A的构造函数会执行吗?
...全文
2233 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
八爻老骥 2020-07-16
  • 打赏
  • 举报
回复
在_B=new B()之前,加个断点,应该会停下来的。或者试着将构造函数改成private,看编译或运行时会不会报错。
正怒月神 2020-07-16
  • 打赏
  • 举报
回复
说实话,我们也就猜测。 一般来说,是会实例化的。 但是到底会不会,你打个断点。要看框架内部是否会避开构造函数。 有些架构自己会生成构造函数,因为他会aop注入一些其他东西。 比较明显的是spring框架。
jhdxhj 2020-07-16
  • 打赏
  • 举报
回复
通过验证我说会执行,有反对的不?
xiaoxiangqing 2020-07-15
  • 打赏
  • 举报
回复
构造函数会运行的
闭包客 2020-07-15
  • 打赏
  • 举报
回复
不调用构造函数创造一个类的实例,其实会带来很多的问题,根源是违背了类的作者的初衷。作者写构造函数的时候,目的就是必然调用,所以构造函数里面很多都是变量的初始化工作。
jhdxhj 2020-07-15
  • 打赏
  • 举报
回复
引用 12 楼 xiaoxiangqing 的回复:
构造函数会运行的
通过验证我说会执行,有反对的不?
快乐起航2020 2020-07-15
  • 打赏
  • 举报
回复
断点调试
闭包客 2020-07-14
  • 打赏
  • 举报
回复
按道理,一个类如果能够顺利实例化,必然有一个构造函数要执行,要么是无参数的构造函数,要么是有参数的构造函数。
耗子哭死猫 2020-07-14
  • 打赏
  • 举报
回复
不执行,没实例化对象,这样赋值也报错,未将实例引用到对象,
wanghui0380 2020-07-14
  • 打赏
  • 举报
回复
你不会自己下个断点么??
  • 打赏
  • 举报
回复
BinaryFormatter 的业务逻辑是非常底层的“复制”信息,这可以说是与“应用领域”无关,而是纯计算机领域的概念。

假设你的对象是业务领域相关的,你就应该让其实例化方法被执行。例如 A 应该引用一个 B 实例对象显然是你想表达应用领域模型,而不是纯计算机领域的 0、1 数据概念。
  • 打赏
  • 举报
回复
如果业务逻辑上看是“应该调用实例化方法的”,但是你下断点发现一个框架没有调用实例化方法,那么这应该看做框架的 bug,抛弃它改用别的框架。
m0_48783917 2020-07-14
  • 打赏
  • 举报
回复
你不会自己下个断点么??
github_36000833 2020-07-14
  • 打赏
  • 举报
回复
引用 3 楼 闭包客 的回复:
按道理,一个类如果能够顺利实例化,必然有一个构造函数要执行,要么是无参数的构造函数,要么是有参数的构造函数。
某些ORM框架会避开构造函数,用意可能是避开构造函数带来的额外逻辑。 实际上从dotnet1.1开始,就可以用FormatterServices.GetUninitializedObject(Type)来创建一个对象却不使用它的构造函数。 Dotnet Remoting的BinaryFormatter也内部利用FormatterServices.GetUninitializedObject来避开构造函数对逆系列化带来的’可能副作用‘。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

class Program
{
    // 在Dotnet Framework 4.0下编译运行
    static void Main(string[] args)
    {
        My my1 = new My(); // 会调用构造函数,并输出'My constructed! Id=123'

        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        bf.Serialize(ms, my1);

        ms.Position = 0;
        My my2 = (My)bf.Deserialize(ms); // 不会调用构造函数
        my2.Id = 888;
        Console.WriteLine("my1.Id={0}; my2.Id={1}", my1.Id, my2.Id);
        ms.Dispose();
        


        Console.WriteLine("另外一种方法");
        Console.ReadLine();

        My my3 = (My)FormatterServices.GetUninitializedObject(typeof(My)); // 不会调用构造函数,但已经分配所需空间
        Console.WriteLine("my3.Id={0}; ",  my3.Id); // my3.Id=0
    }
}

[Serializable]
class My
{
    public My()
    {
        Id = 123;
        Console.WriteLine("My constructed! Id=" + Id);
    }
    public int Id { get; set; }
}

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧