List<A> _As;
_As = _DbCnn.Query<A>(sql).ToList();//這里是資料庫查詢出來的集合
物件A有一個建構式
public A()
{
_B = new B();
}
請問 _As = _DbCnn.Query<A>(sql).ToList(); 這里賦值的時候,物件A的建構式會執行嗎?
uj5u.com熱心網友回復:
你不會自己下個斷點么??uj5u.com熱心網友回復:
不執行,沒實體化物件,這樣賦值也報錯,未將實體參考到物件,uj5u.com熱心網友回復:
按道理,一個類如果能夠順利實體化,必然有一個建構式要執行,要么是無引數的建構式,要么是有引數的建構式。uj5u.com熱心網友回復:
某些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; }
}
uj5u.com熱心網友回復:
你不會自己下個斷點么??uj5u.com熱心網友回復:
如果業務邏輯上看是“應該呼叫實體化方法的”,但是你下斷點發現一個框架沒有呼叫實體化方法,那么這應該看做框架的 bug,拋棄它改用別的框架。uj5u.com熱心網友回復:
BinaryFormatter 的業務邏輯是非常底層的“復制”資訊,這可以說是與“應用領域”無關,而是純計算機領域的概念。假設你的物件是業務領域相關的,你就應該讓其實體化方法被執行。例如 A 應該參考一個 B 實體物件顯然是你想表達應用領域模型,而不是純計算機領域的 0、1 資料概念。
uj5u.com熱心網友回復:
不呼叫建構式創造一個類的實體,其實會帶來很多的問題,根源是違背了類的作者的初衷。作者寫建構式的時候,目的就是必然呼叫,所以建構式里面很多都是變數的初始化作業。uj5u.com熱心網友回復:
建構式會運行的uj5u.com熱心網友回復:
斷點除錯
uj5u.com熱心網友回復:
通過驗證我說會執行,有反對的不?
uj5u.com熱心網友回復:
通過驗證我說會執行,有反對的不?uj5u.com熱心網友回復:
說實話,我們也就猜測。一般來說,是會實體化的。
但是到底會不會,你打個斷點。要看框架內部是否會避開建構式。
有些架構自己會生成建構式,因為他會aop注入一些其他東西。
比較明顯的是spring框架。
uj5u.com熱心網友回復:
在_B=new B()之前,加個斷點,應該會停下來的。或者試著將建構式改成private,看編譯或運行時會不會報錯。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/22842.html
標籤:C#
上一篇:請問各位大佬,為什么TCP一個執行緒接收,一個執行緒處理,會出現佇列為空的情況呢?
下一篇:C#生成簽字報表相關 求助
