Что является более эффективным {X: Static Class.Default} или {StaticResource Class}? - PullRequest
4 голосов
/ 26 марта 2011

Предположим, у меня есть класс, на который я хочу ссылаться в XAML.

public class MyConverter
{
  public static readonly MyConverter Default = new MyConverter();
  ...
};

А затем в XAML я могу ссылаться на него либо

<Label Content="{Binding Text,Converter={x:Static local:MyConverter.Default}"/>

, либо

<local:MyConverter x:Key="MyConverter"/>
...
<Label Content="{Binding Text,Converter={StaticResource local:MyConverter}"/>

Какой способ более эффективен?

Ответы [ 2 ]

2 голосов
/ 26 марта 2011

Я сомневаюсь, что что-то здесь будет более эффективным, чем другое, но ключевое отличие здесь в том, что на самом деле происходит:

  1. При первом подходе вы ссылаетесь на статическое поле класса MyConverter
  2. Во втором случае вы создаете экземпляр из MyConverter и используете его.

Я полагаю, что сначала можно на пару процентов быстрее (или что вы подразумеваете под эффективностью?), Но эта разница не принесет вам большой прибыли. Я бы выбрал вариант № 1, если у вас уже есть статическое поле. Также, насколько я помню, x:Static все еще недоступен в Silverlight.

1 голос
/ 12 января 2019

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

public class VisibilityConverter : IValueConverter
{
    private static readonly VisibilityConverter defaultInstance = new VisibilityConverter();

    public static VisibilityConverter Default = new VisibilityConverter();
    public static VisibilityConverter InverseBoolean = new VisibilityConverter() { Inverse = true };

        public bool Inverse { get; set; }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var isVisible = value != null
                && value.GetType() == typeof(bool)
                && (bool)value;

            if (Inverse)
            {
                isVisible = !isVisible;
            }

            return isVisible ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
        }

Затем его можно легко использовать по умолчанию и в инверсном режиме:

Converter={x:Static converters:VisibilityConverter.Default}
Converter={x:Static converters:VisibilityConverter.InverseBoolean}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...