Насколько это медленно? INotifyPropertyChanged с использованием StackTrace

Сегодня, Я наткнулся на интересный способ реализации интерфейса INotifyPropertyChanged. Вместо передачи строкового имени измененного свойства или лямбда-выражения мы можем просто вызвать RaisePropertyChanged (); из установщика отметьте, что вызов не имеет параметров. Это код метода RaisePropertyChanged ():

public virtual void RaisePropertyChanged()
{
    var frames = new System.Diagnostics.StackTrace();
    for (var i = 0; i < frames.FrameCount; i++)
    {
        var frame = frames.GetFrame(i).GetMethod() as MethodInfo;
        if (frame != null)
            if (frame.IsSpecialName && frame.Name.StartsWith("set_"))
            {
                RaisePropertyChanged(frame.Name.Substring(4));
                return;
            }
    }
    throw new InvalidOperationException("NotifyPropertyChanged() can only by invoked within a property setter.");
}

И это свойство, которое будет уведомлять своих иждивенцев о своем изменении:

public string MyProperty
{
    get { return _myField; }
    set
    {
        _myField= value;
        RaisePropertyChanged();
    }
}

Хотя мне этот подход интересен, я думаю, что снижение производительности может быть серьезным в случае, если свойство часто меняется ... или если каждое свойство в нашем приложении использовало этот подход для уведомления о его изменении.

Я хотел бы услышать ваше мнение. (галочки вики-сообщества больше нет?) или лямбда-выражение, мы можем просто вызвать RaisePropertyChanged (); из установщика отметьте, что вызов не имеет параметров. Это код метода RaisePropertyChanged ():

public virtual void RaisePropertyChanged()
{
    var frames = new System.Diagnostics.StackTrace();
    for (var i = 0; i < frames.FrameCount; i++)
    {
        var frame = frames.GetFrame(i).GetMethod() as MethodInfo;
        if (frame != null)
            if (frame.IsSpecialName && frame.Name.StartsWith("set_"))
            {
                RaisePropertyChanged(frame.Name.Substring(4));
                return;
            }
    }
    throw new InvalidOperationException("NotifyPropertyChanged() can only by invoked within a property setter.");
}

И это свойство, которое будет уведомлять своих иждивенцев о своем изменении:

public string MyProperty
{
    get { return _myField; }
    set
    {
        _myField= value;
        RaisePropertyChanged();
    }
}

Хотя мне этот подход интересен, я думаю, что снижение производительности может быть серьезным в случае, если свойство часто меняется ... или если каждое свойство в нашем приложении использовало этот подход для уведомления о его изменении.

Я хотел бы услышать ваше мнение. (галочки вики-сообщества больше нет?) или лямбда-выражение, мы можем просто вызвать RaisePropertyChanged (); из установщика отметьте, что вызов не имеет параметров. Это код метода RaisePropertyChanged ():

public virtual void RaisePropertyChanged()
{
    var frames = new System.Diagnostics.StackTrace();
    for (var i = 0; i < frames.FrameCount; i++)
    {
        var frame = frames.GetFrame(i).GetMethod() as MethodInfo;
        if (frame != null)
            if (frame.IsSpecialName && frame.Name.StartsWith("set_"))
            {
                RaisePropertyChanged(frame.Name.Substring(4));
                return;
            }
    }
    throw new InvalidOperationException("NotifyPropertyChanged() can only by invoked within a property setter.");
}

И это свойство, которое будет уведомлять своих иждивенцев о своем изменении:

public string MyProperty
{
    get { return _myField; }
    set
    {
        _myField= value;
        RaisePropertyChanged();
    }
}

Хотя мне этот подход интересен, я думаю, что снижение производительности может быть серьезным в случае, если свойство часто меняется ... или если каждое свойство в нашем приложении использовало этот подход для уведомления о его изменении.

Я хотел бы услышать ваше мнение. (галочки вики-сообщества больше нет?) Я думаю, что снижение производительности может быть серьезным, если свойство часто меняется ... или если каждое свойство в нашем приложении использует этот подход для уведомления о его изменении.

Я хотел бы услышать ваше мнение. (галочки вики-сообщества больше нет?) Я думаю, что снижение производительности может быть серьезным, если свойство часто меняется ... или если каждое свойство в нашем приложении использует этот подход для уведомления о его изменении.

Я хотел бы услышать ваше мнение. (галочки вики-сообщества больше нет?) void * buf, size_t len); Могу ли я прочитать данные непосредственно в ...

Меня интересует следующая проблема: предположим, у меня есть функция стиля C, которая считывает необработанные данные в буфер

int recv_n(int handle, void* buf, size_t len);

Могу ли я прочитать данные непосредственно в std: string или stringstream без выделения временных буферов? Например,

std::string s(100, '\0');
recv_n(handle, s.data(), 100);

я предполагаю, что это решение имеет неопределенный результат, потому что afaik, string :: c_str и string :: data могут возвращать временное местоположение и не обязательно возвращать указатель на реальное место в памяти, используемое объектом для хранения данных.

Есть идеи?

5
задан FireAphis 23 December 2010 в 16:57
поделиться