Я работал над тем, чтобы сделать некоторый код более эффективным, и мне интересно, какой шаблон является более эффективным.Решение имеет код на VB.NET и C # по старым причинам.
Я поместил в версии VB и C # два подхода, которые у нас есть.
Идея состоит в том, что еслиДоступ к свойству Foo
и _foo
равен нулю, тогда он будет установлен на новый объект, и любые последующие запросы будут обращаться к этому же объекту и не будут создавать новый каждый раз.
Я знаю, чтокомпилятор и JIT делают некоторые умные вещи под капотом, но я не уверен, какой из этих способов более эффективен.
Вариант 1: объединить значение.Visual Studio продолжает рекомендовать коалесценцию местами, поэтому я думаю, что эта операция довольно оптимизирована.Однако это присваивает _foo
каждый раз, когда мы получаем Foo
Вариант 2: Выполните сравнение _foo
и null
, а затем присвойте _foo
только при необходимости.
ЯЯ уверен, что разница между скоростями практически отсутствует, но мне любопытно, как они обрабатываются на гораздо более низком уровне
Private _foo As List(Of Fubar)
Private _bar As String
Private _foo2 As List(Of Fubar)
Private _bar2 As String
Public Property Foo As List(Of Fubar)
Get
_foo = If(_foo, New List(Of Fubar))
Return _foo
End Get
Set (value As List(Of Fubar))
_foo = value
End Set
End Property
Public Property Bar As String
Get
_bar = If(_bar, String.Empty)
Return _bar
End Get
Set (value As String)
_bar = value
End Set
End Property
Public Property Foo2 As List(Of Fubar)
Get
If _foo2 Is Nothing Then _foo2 = New List(Of Fubar)
Return _foo2
End Get
Set (value As List(Of Fubar))
_foo2 = value
End Set
End Property
Public Property Bar2 As String
Get
If _bar2 Is Nothing Then _bar2 = String.Empty
Return _bar2
End Get
Set (value As String)
_bar2 = value
End Set
End Property
private List<Fubar> _foo;
private string _bar;
private List<Fubar> _foo2;
private string _bar2;
public List<Fubar> Foo
{
get
{
_foo = (_foo ?? new List<Fubar>());
return _foo;
}
set
{
_foo = value;
}
}
public string Bar
{
get
{
_bar = (_bar ?? string.Empty);
return _bar;
}
set
{
_bar = value;
}
}
public List<Fubar> Foo2
{
get
{
if (_foo2 == null) { _foo2 = new List<Fubar>(); }
return _foo2;
}
set
{
_foo2 = value;
}
}
public string Bar2
{
get
{
if (_bar2 == null) { _bar2 = string.Empty; }
return _bar2;
}
set
{
_bar2 = value;
}
}