way*_*are 53 .net c# memory-management
使用C#对象初始化器有什么好处吗?
在C++中没有引用,并且所有内容都封装在对象中,因此在创建对象后使用它们而不是初始化成员是有意义的.
它们在C#中使用的情况如何?
Jon*_*yna 105
一个经常遗漏的好处是原子性.如果您在对象上使用双重检查锁定,这将非常有用.对象初始化程序在初始化了您告诉它的所有成员之后返回新对象.从MSDN文章的示例:
StudentName student = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
ID = 116
};
Run Code Online (Sandbox Code Playgroud)
将被翻译成如下内容:
StudentName _tempStudent = new StudentName();
_tempStudent.FirstName = "Craig";
_tempStudent.LastName = "Playstead";
_tempStudent.ID = 116;
StudentName student = _tempStudent;
Run Code Online (Sandbox Code Playgroud)
这可确保student永远不会部分初始化.它将被null初始化或完全初始化,这在多线程场景中很有用.
有关这方面的更多信息,您可以查看这篇文章.
另一个好处是它允许您创建匿名对象(例如,在LINQ中创建投影或连接多个键).
Gei*_*tad 30
有可能不 使用对象初始值设定项:如果在初始化期间出现异常,则Visual Studio调试器中的调用堆栈将仅返回初始化表达式而不返回发生异常的特定行.
如果您使用具有命名不佳的异常的库或外部服务,或者使用具有本机代码的库,而您无法看到引发异常的代码(例如Android上的Xamarin),则对象初始化程序可能会使调试代码变得更加困难,因为你不知道哪个参数引发了异常.
示例:想象一下这是您的代码,但您无法读取ExternalService的来源,因为它在您的应用程序外部.您不会知道是在"外部服务"中导致错误的"charlie"参数.
var instance = new ClassToBeInitialized
{
alpha = "alpha",
bravo = ExternalService(0),
charlie = ExternalService(1)
};
private static string ExternalService(int parameter)
{
if (parameter == 1)
{
throw new Exception("The external service crashed");
}
return "correctStringResult";
}
Run Code Online (Sandbox Code Playgroud)
AD.*_*Net 15
好处是使用匿名对象,linq查询,有时不必要的重载构造函数只是为了传递参数
| 归档时间: |
|
| 查看次数: |
19607 次 |
| 最近记录: |