9

我刚刚重新考虑过WindowsBase.dll >> System.Windows.UncommonField<T>,我想知道这个类的用法......例如它在Button-class中使用:

public class Button : ButtonBase
{    
    private static readonly UncommonField<KeyboardFocusChangedEventHandler> FocusChangedEventHandlerField = new UncommonField<KeyboardFocusChangedEventHandler>();
}

那么这个“包装器”有什么用呢?

4

1 回答 1

11

简短的回答

它用于降低内存使用量。

更长的答案

让我们从依赖属性开始。在每DependencyObject一个上,都可以定义大量的依赖属性。无论是诸如“本地”之DependencyProperty类的TextBox.Text还是附加的诸如之类Grid.Row的,它们中的大多数都从未设置过,仅保留其默认值。为了DependencyObject通过为每个定义的依赖属性存储一个值来避免每个实例占用数千字节的内存,只有与默认值不同的值才会保存在实例中。

现在遇到内部UncommonField<T>类。您可以将其视为轻量级DependencyProperty,无需任何元数据、强制或属性更改通知。但是,它的值使用与 real 相同的机制DependencyProperty:它必须不同于默认值才能存储在DependencyObject. 由于KeyboardFocusChanged事件很少使用(解释不常见的形容词),所以在这里节省一点内存是有意义的。

但是你可能不是微软在编写一个必须考虑数千个DependencyObject实例并针对几个字节进行优化的框架。只需将 a 替换为static UncommonField<T> someFieldinstance T someField

于 2013-08-16T18:46:15.343 回答