Учитывая, что никто не упомянул об этом ...
Некоторые языки высокого уровня, такие как Python и Java, поставляются с инструментами для преодоления ограничений двоичной с плавающей запятой. Например:
decimal
Python [и g0] и класс BigDecimal
Java [], которые представляют числа внутри с десятичной нотацией (в отличие от двоичная запись). Оба имеют ограниченную точность, поэтому они все еще подвержены ошибкам, однако они решают наиболее распространенные проблемы с бинарной арифметикой с плавающей запятой. Десятичные числа очень хороши при работе с деньгами: десять центов плюс двадцать центов всегда ровно тридцать центов: >>> 0.1 + 0.2 == 0.3
False
>>> Decimal('0.1') + Decimal('0.2') == Decimal('0.3')
True
Модуль decimal
Python основан на стандарте IEEE стандарта 802.118 . fractions
модуль и класс Apache Common BigFraction
. Оба представляют собой рациональные числа как пары (numerator, denominator)
, и они могут давать более точные результаты, чем десятичная арифметика с плавающей запятой. Ни одно из этих решений не идеально (особенно, если мы смотрим на выступления, или если мы требуют очень высокой точности), но все же они решают большое количество проблем с двоичной арифметикой с плавающей запятой.
Оператор нулевого распространения возвращает значение. И поскольку у вас должна быть переменная с левой стороны задания, а не значение, вы не можете использовать ее таким образом.
Конечно, вы могли бы сделать вещи короче, используя оператор tenary, но что, с другой стороны, не очень помогает аспекту читаемости.
Комментарий Иоахима Исакссона по вашему вопросу показывает другой подход, который должен работать.
Общий метод расширения SetValue (но только для свойств ref) будет:
public static void SetValue<T>(this T property, T value)
{
property = value;
}
И будет использоваться как
ButtonOrNull?.Visibility.SetValue(Visibility.Hidden);
Как предложил Йохахим Исакссон в комментариях, теперь у меня есть метод SetData(Data data)
и используйте его следующим образом:
MyPage1?.SetData(this.data);
MyPage2?.SetData(this.data);
MyPage3?.SetData(this.data);
Я придумал следующее расширение:
public static class ObjectExtensions
{
public static void SetValue<TValue>(this object @object, string propertyName, TValue value)
{
var property = @object.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance);
if (property?.CanWrite == true)
property.SetValue(@object, value, null);
}
}
, которое можно назвать глобально; это работает только в публичных свойствах.
myObject?.SetValue("MyProperty", new SomeObject());
Следующая улучшенная версия работает на что угодно,
public static void SetValue<TObject>(this TObject @object, Action<TObject> assignment)
{
assignment(@object);
}
И также может быть вызвана глобально,
myObject?.SetValue(i => i.MyProperty = new SomeObject());
Но имя расширения несколько вводит в заблуждение, поскольку Action
не требует исключительно назначения.
Попробуйте добавить все ваши страницы в myPageList.
IEnumerable<MyPage> myPageList;
foreach(MyPage myPage in myPageList)
{
if (myPage != null)
myPage.Data = this.data;
}