Конструкторы, вызывающие другие конструкторы: есть проблемы с производительностью? - PullRequest
2 голосов
/ 06 мая 2011

В приложении, где производительность имеет решающее значение, будет ли какое-либо заметное преимущество Сценарий 1 (полностью отдельные конструкторы) по сравнению с Сценарий 2 (конструкторы с вызовом цепочки)?

Сценарий 1

Class TwoInts

    Private a, b As Integer

    Public Sub New(ByVal a As Integer, ByVal b As Integer)
        Me.a = a
        Me.b = b
    End Sub

    Public Sub New(ByVal a As Integer)
        Me.a = a
        Me.b = 0
    End Sub

    Public Sub New()
        Me.a = 0
        Me.b = 0
    End Sub

End Class

Сценарий 2

Class TwoInts

    Private a, b As Integer

    Public Sub New(ByVal a As Integer, ByVal b As Integer)
        Me.a = a
        Me.b = b
    End Sub

    Public Sub New(ByVal a As Integer)
        Me.New(a, 0)
    End Sub

    Public Sub New()
        Me.New(0)
    End Sub

End Class

Ответы [ 4 ]

4 голосов
/ 06 мая 2011

Нет, заметной разницы не будет.

Вы можете запустить свой собственный тест и узнать.

0 голосов
/ 13 марта 2013

Не используйте общий метод Init (), предложенный Марино Шимичем! Это стиль C ++ и не подходит для C #. В C # инициализация должна быть сделана в конструкторах!

Подробнее см. Книгу Билла Вагнерса "Эффективный C #":

http://www.diranieh.com/NETCSharp/EffectiveCS.htm#14._Use_Constructor_Chaining

0 голосов
/ 06 мая 2011

Это зависит от того, что вы подразумеваете под заметным.Сценарий 1 действительно вводит дополнительные вызовы, но время, которое он добавляет, будет измеряться долями миллисекунды.Сценарий 2 будет быстрее.(Это также увеличит размер сгенерированного кода.)

0 голосов
/ 06 мая 2011

Скорость не должна сильно отличаться.Есть только еще 2 вызова от простого конструктора к глубокому ... но:

Вы должны спросить язык C #, что он думает о конструкторах, которые вызывают конструкторы: P Там это не очень хорошо,Я думаю, что вы должны придерживаться другого подхода, такого как создание «метода инициализации», вызывать его из каждого конструктора и иметь более читаемый код.Там вам нужно будет использовать нотацию ": this (0)", которая не очень удобочитаема (например, процедурная при ее чтении).И для того, чтобы что-то сделать, понадобится на один звонок меньше.

...