Browse Source

Applied a bunch of resharper suggestions.

Steven Kirk 10 years ago
parent
commit
67835cc09b
100 changed files with 199 additions and 472 deletions
  1. 1 1
      src/Gtk/Perspex.Cairo/CairoPlatform.cs
  2. 1 1
      src/Gtk/Perspex.Cairo/Media/FormattedTextImpl.cs
  3. 1 1
      src/Gtk/Perspex.Cairo/RenderTarget.cs
  4. 1 1
      src/Markup/Perspex.Markup.Xaml/Context/PerspexContentPropertyProvider.cs
  5. 3 7
      src/Markup/Perspex.Markup.Xaml/Converters/PerspexPropertyTypeConverter.cs
  6. 1 1
      src/Markup/Perspex.Markup.Xaml/Data/MultiBinding.cs
  7. 1 1
      src/Markup/Perspex.Markup.Xaml/Parsers/SelectorParser.cs
  8. 1 9
      src/Markup/Perspex.Markup.Xaml/Templates/MemberSelector.cs
  9. 1 4
      src/Markup/Perspex.Markup/Data/ExpressionNode.cs
  10. 2 2
      src/Markup/Perspex.Markup/Data/ExpressionObserver.cs
  11. 2 2
      src/Markup/Perspex.Markup/Data/ExpressionSubject.cs
  12. 1 1
      src/Markup/Perspex.Markup/Data/IndexerNode.cs
  13. 2 2
      src/Markup/Perspex.Markup/Data/LogicalNotNode.cs
  14. 1 1
      src/Markup/Perspex.Markup/Data/Parsers/Reader.cs
  15. 5 11
      src/Markup/Perspex.Markup/Data/Plugins/InpcPropertyAccessorPlugin.cs
  16. 4 10
      src/Markup/Perspex.Markup/Data/Plugins/PerspexPropertyAccessorPlugin.cs
  17. 1 1
      src/Markup/Perspex.Markup/FuncMultiValueConverter.cs
  18. 1 1
      src/Markup/Perspex.Markup/FuncValueConverter.cs
  19. 1 1
      src/Markup/Perspex.Markup/StringConverters.cs
  20. 1 6
      src/Perspex.Animation/Animatable.cs
  21. 2 3
      src/Perspex.Animation/LinearEasing.cs
  22. 2 14
      src/Perspex.Application/Application.cs
  23. 1 1
      src/Perspex.Base/BindingDescriptor.cs
  24. 1 4
      src/Perspex.Base/Collections/PerspexDictionary.cs
  25. 4 12
      src/Perspex.Base/Collections/PerspexList.cs
  26. 2 2
      src/Perspex.Base/Metadata/XmlnsDefinitionAttribute.cs
  27. 1 1
      src/Perspex.Base/PerspexLocator.cs
  28. 4 13
      src/Perspex.Base/PerspexObject.cs
  29. 1 1
      src/Perspex.Base/PerspexProperty.cs
  30. 1 4
      src/Perspex.Base/PriorityBindingEntry.cs
  31. 1 4
      src/Perspex.Base/Reactive/PerspexObservable.cs
  32. 2 6
      src/Perspex.Base/Threading/DispatcherTimer.cs
  33. 2 2
      src/Perspex.Base/Threading/SingleThreadDispatcher.cs
  34. 1 4
      src/Perspex.Controls/Button.cs
  35. 5 29
      src/Perspex.Controls/Control.cs
  36. 1 6
      src/Perspex.Controls/Decorator.cs
  37. 4 7
      src/Perspex.Controls/DockPanel.cs
  38. 5 16
      src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
  39. 3 3
      src/Perspex.Controls/HotkeyManager.cs
  40. 1 4
      src/Perspex.Controls/ListBox.cs
  41. 1 1
      src/Perspex.Controls/Menu.cs
  42. 2 9
      src/Perspex.Controls/MenuItem.cs
  43. 2 6
      src/Perspex.Controls/MenuItemAccessKeyHandler.cs
  44. 1 5
      src/Perspex.Controls/Primitives/AdornerLayer.cs
  45. 3 5
      src/Perspex.Controls/Primitives/Popup.cs
  46. 2 7
      src/Perspex.Controls/Primitives/PopupRoot.cs
  47. 1 1
      src/Perspex.Controls/Primitives/SelectingItemsControl.cs
  48. 1 4
      src/Perspex.Controls/TabControl.cs
  49. 1 3
      src/Perspex.Controls/Templates/FuncDataTemplate.cs
  50. 1 1
      src/Perspex.Controls/Templates/FuncDataTemplate`1.cs
  51. 1 1
      src/Perspex.Controls/Templates/FuncMemberSelector.cs
  52. 1 3
      src/Perspex.Controls/Templates/FuncTreeDataTemplate.cs
  53. 1 1
      src/Perspex.Controls/Templates/FuncTreeDataTemplate`1.cs
  54. 1 1
      src/Perspex.Controls/TextBox.cs
  55. 1 1
      src/Perspex.Controls/ToolTip.cs
  56. 9 29
      src/Perspex.Controls/TopLevel.cs
  57. 1 1
      src/Perspex.Controls/UserControl.cs
  58. 2 2
      src/Perspex.Controls/Window.cs
  59. 1 12
      src/Perspex.Diagnostics/LogManager.cs
  60. 1 1
      src/Perspex.Diagnostics/ViewModels/PropertyDetails.cs
  61. 1 1
      src/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs
  62. 1 1
      src/Perspex.HtmlRenderer/Adapters/GraphicsAdapter.cs
  63. 1 1
      src/Perspex.Input/FocusManager.cs
  64. 2 2
      src/Perspex.Input/KeyBinding.cs
  65. 1 1
      src/Perspex.Input/KeyGesture.cs
  66. 8 14
      src/Perspex.Input/KeyboardDevice.cs
  67. 14 20
      src/Perspex.Input/MouseDevice.cs
  68. 3 10
      src/Perspex.Input/Navigation/DirectionalNavigation.cs
  69. 3 10
      src/Perspex.Input/Navigation/TabNavigation.cs
  70. 4 20
      src/Perspex.Layout/Layoutable.cs
  71. 1 1
      src/Perspex.SceneGraph/Media/Color.cs
  72. 1 9
      src/Perspex.SceneGraph/Media/DashStyle.cs
  73. 2 2
      src/Perspex.SceneGraph/Media/DrawingContext.cs
  74. 3 8
      src/Perspex.SceneGraph/Media/PathMarkupParser.cs
  75. 1 4
      src/Perspex.SceneGraph/Media/Transform.cs
  76. 1 1
      src/Perspex.SceneGraph/RelativePoint.cs
  77. 1 1
      src/Perspex.SceneGraph/RelativeRect.cs
  78. 1 1
      src/Perspex.SceneGraph/Rendering/RendererBase.cs
  79. 1 1
      src/Perspex.SceneGraph/Thickness.cs
  80. 1 5
      src/Perspex.SceneGraph/Visual.cs
  81. 2 2
      src/Perspex.SceneGraph/VisualTree/BoundsTracker.cs
  82. 1 5
      src/Perspex.Styling/Styling/Classes.cs
  83. 1 4
      src/Perspex.Styling/Styling/Selector.cs
  84. 2 2
      src/Perspex.Styling/Styling/StyleBinding.cs
  85. 7 14
      src/Perspex.Styling/Styling/Styler.cs
  86. 1 1
      src/Shared/PlatformSupport/AssetLoader.cs
  87. 2 2
      src/Shared/RenderHelpers/TileBrushImplHelper.cs
  88. 1 1
      src/Skia/Perspex.Skia/DrawingContextImpl.cs
  89. 3 3
      src/Skia/Perspex.Skia/FormattedTextImpl.cs
  90. 2 2
      src/Skia/Perspex.Skia/NativeBrush.cs
  91. 1 1
      src/Skia/Perspex.Skia/PerspexHandleHolder.cs
  92. 1 1
      src/Windows/Perspex.Designer/AppHost/PerspexAppHost.cs
  93. 2 2
      src/Windows/Perspex.Designer/AppHost/WindowHost.cs
  94. 3 3
      src/Windows/Perspex.Designer/Comm/CommChannel.cs
  95. 1 1
      src/Windows/Perspex.Designer/PerspexDesigner.xaml
  96. 1 1
      src/Windows/Perspex.Direct2D1/Media/DrawingContext.cs
  97. 1 3
      src/Windows/Perspex.Win32/Input/WindowsMouseDevice.cs
  98. 2 2
      src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs
  99. 3 14
      src/Windows/Perspex.Win32/WindowImpl.cs
  100. 1 1
      tests/Perspex.Base.UnitTests/PerspexObjectTests_Direct.cs

+ 1 - 1
src/Gtk/Perspex.Cairo/CairoPlatform.cs

@@ -16,7 +16,7 @@ namespace Perspex.Cairo
     {
         private static readonly CairoPlatform s_instance = new CairoPlatform();
 
-        private static Pango.Context s_pangoContext = CreatePangoContext();
+        private static readonly Pango.Context s_pangoContext = CreatePangoContext();
 
         public static void Initialize() => PerspexLocator.CurrentMutable.Bind<IPlatformRenderInterface>().ToConstant(s_instance);
 

+ 1 - 1
src/Gtk/Perspex.Cairo/Media/FormattedTextImpl.cs

@@ -13,7 +13,7 @@ namespace Perspex.Cairo.Media
     public class FormattedTextImpl : IFormattedTextImpl
     {
         private Size _size;
-        private string _text;
+        private readonly string _text;
 
         public FormattedTextImpl(
             Pango.Context context,

+ 1 - 1
src/Gtk/Perspex.Cairo/RenderTarget.cs

@@ -19,7 +19,7 @@ namespace Perspex.Cairo
     public class RenderTarget : IRenderTarget
     {
         private readonly Surface _surface;
-        private Gtk.Window _window;
+        private readonly Gtk.Window _window;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="RenderTarget"/> class.

+ 1 - 1
src/Markup/Perspex.Markup.Xaml/Context/PerspexContentPropertyProvider.cs

@@ -15,7 +15,7 @@ namespace Perspex.Markup.Xaml.Context
 {
     public class PerspexContentPropertyProvider : IContentPropertyProvider
     {
-        private Dictionary<Type, string> _values = new Dictionary<Type, string>();
+        private readonly Dictionary<Type, string> _values = new Dictionary<Type, string>();
 
         public string GetContentPropertyName(Type type)
         {

+ 3 - 7
src/Markup/Perspex.Markup.Xaml/Converters/PerspexPropertyTypeConverter.cs

@@ -55,13 +55,9 @@ namespace Perspex.Markup.Xaml.Converters
             }
 
             // First look for non-attached property on the type and then look for an attached property.
-            var property = PerspexPropertyRegistry.Instance.FindRegistered(type, s);
-            
-            if (property == null)
-            {
-                property = PerspexPropertyRegistry.Instance.GetAttached(type)
-                    .FirstOrDefault(x => x.Name == propertyName);
-            }
+            var property = PerspexPropertyRegistry.Instance.FindRegistered(type, s) ??
+                           PerspexPropertyRegistry.Instance.GetAttached(type)
+                           .FirstOrDefault(x => x.Name == propertyName);
 
             if (property == null)
             {

+ 1 - 1
src/Markup/Perspex.Markup.Xaml/Data/MultiBinding.cs

@@ -79,7 +79,7 @@ namespace Perspex.Markup.Xaml.Data
 
             var result = new BehaviorSubject<object>(PerspexProperty.UnsetValue);
             var children = Bindings.Select(x => x.CreateSubject(target, typeof(object)));
-            var input = Observable.CombineLatest(children).Select(x =>
+            var input = children.CombineLatest().Select(x =>
                 Converter.Convert(x, targetType, null, CultureInfo.CurrentUICulture));
             input.Subscribe(result);
             return result;

+ 1 - 1
src/Markup/Perspex.Markup.Xaml/Parsers/SelectorParser.cs

@@ -14,7 +14,7 @@ namespace Perspex.Markup.Xaml.Parsers
     /// </summary>
     public class SelectorParser
     {
-        private Func<string, string, Type> _typeResolver;
+        private readonly Func<string, string, Type> _typeResolver;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="SelectorParser"/> class.

+ 1 - 9
src/Markup/Perspex.Markup.Xaml/Templates/MemberSelector.cs

@@ -14,15 +14,7 @@ namespace Perspex.Markup.Xaml.Templates
         {
             // TODO: Handle nested property paths, changing values etc.
             var property = o.GetType().GetRuntimeProperty(MemberName);
-
-            if (property != null)
-            {
-                return property.GetValue(o);
-            }
-            else
-            {
-                return null;
-            }
+            return property?.GetValue(o);
         }
     }
 }

+ 1 - 4
src/Markup/Perspex.Markup/Data/ExpressionNode.cs

@@ -63,10 +63,7 @@ namespace Perspex.Markup.Data
                     Next.Target = value;
                 }
 
-                if (_subject != null)
-                {
-                    _subject.OnNext(value);
-                }
+                _subject?.OnNext(value);
             }
         }
 

+ 2 - 2
src/Markup/Perspex.Markup/Data/ExpressionObserver.cs

@@ -180,9 +180,9 @@ namespace Perspex.Markup.Data
                 {
                     _node.Target = _rootGetter();
                 }
-                else if (_empty != null)
+                else
                 {
-                    _empty.OnNext(_rootGetter());
+                    _empty?.OnNext(_rootGetter());
                 }
             }
         }

+ 2 - 2
src/Markup/Perspex.Markup/Data/ExpressionSubject.cs

@@ -15,8 +15,8 @@ namespace Perspex.Markup.Data
     /// </summary>
     public class ExpressionSubject : ISubject<object>, IDescription
     {
-        private ExpressionObserver _inner;
-        private Type _targetType;
+        private readonly ExpressionObserver _inner;
+        private readonly Type _targetType;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="ExpressionObserver"/> class.

+ 1 - 1
src/Markup/Perspex.Markup/Data/IndexerNode.cs

@@ -12,7 +12,7 @@ namespace Perspex.Markup.Data
 {
     internal class IndexerNode : ExpressionNode
     {
-        private int[] _intArgs;
+        private readonly int[] _intArgs;
 
         public IndexerNode(IList<object> arguments)
         {

+ 2 - 2
src/Markup/Perspex.Markup/Data/LogicalNotNode.cs

@@ -16,10 +16,10 @@ namespace Perspex.Markup.Data
 
         public override IDisposable Subscribe(IObserver<object> observer)
         {
-            return Next.Select(x => Negate(x)).Subscribe(observer);
+            return Next.Select(Negate).Subscribe(observer);
         }
 
-        private object Negate(object v)
+        private static object Negate(object v)
         {
             if (v != PerspexProperty.UnsetValue)
             {

+ 1 - 1
src/Markup/Perspex.Markup/Data/Parsers/Reader.cs

@@ -7,7 +7,7 @@ namespace Perspex.Markup.Data.Parsers
 {
     internal class Reader
     {
-        private string _s;
+        private readonly string _s;
         private int _i;
 
         public Reader(string s)

+ 5 - 11
src/Markup/Perspex.Markup/Data/Plugins/InpcPropertyAccessorPlugin.cs

@@ -56,9 +56,9 @@ namespace Perspex.Markup.Data.Plugins
 
         private class Accessor : IPropertyAccessor
         {
-            private object _instance;
-            private PropertyInfo _property;
-            private Action<object> _changed;
+            private readonly object _instance;
+            private readonly PropertyInfo _property;
+            private readonly Action<object> _changed;
 
             public Accessor(object instance, PropertyInfo property, Action<object> changed)
             {
@@ -77,15 +77,9 @@ namespace Perspex.Markup.Data.Plugins
                 }
             }
 
-            public Type PropertyType
-            {
-                get { return _property.PropertyType; }
-            }
+            public Type PropertyType => _property.PropertyType;
 
-            public object Value
-            {
-                get { return _property.GetValue(_instance); }
-            }
+            public object Value => _property.GetValue(_instance);
 
             public void Dispose()
             {

+ 4 - 10
src/Markup/Perspex.Markup/Data/Plugins/PerspexPropertyAccessorPlugin.cs

@@ -56,8 +56,8 @@ namespace Perspex.Markup.Data.Plugins
 
         private class Accessor : IPropertyAccessor
         {
-            private PerspexObject _instance;
-            private PerspexProperty _property;
+            private readonly PerspexObject _instance;
+            private readonly PerspexProperty _property;
             private IDisposable _subscription;
 
             public Accessor(PerspexObject instance, PerspexProperty property, Action<object> changed)
@@ -70,15 +70,9 @@ namespace Perspex.Markup.Data.Plugins
                 _subscription = instance.GetObservable(property).Skip(1).Subscribe(changed);
             }
 
-            public Type PropertyType
-            {
-                get { return _property.PropertyType; }
-            }
+            public Type PropertyType => _property.PropertyType;
 
-            public object Value
-            {
-                get { return _instance.GetValue(_property); }
-            }
+            public object Value => _instance.GetValue(_property);
 
             public void Dispose()
             {

+ 1 - 1
src/Markup/Perspex.Markup/FuncMultiValueConverter.cs

@@ -16,7 +16,7 @@ namespace Perspex.Markup
     /// <typeparam name="TOut">The output type.</typeparam>
     public class FuncMultiValueConverter<TIn, TOut> : IMultiValueConverter
     {
-        private Func<IEnumerable<TIn>, TOut> _convert;
+        private readonly Func<IEnumerable<TIn>, TOut> _convert;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="FuncValueConverter{TIn, TOut}"/> class.

+ 1 - 1
src/Markup/Perspex.Markup/FuncValueConverter.cs

@@ -15,7 +15,7 @@ namespace Perspex.Markup
     /// <typeparam name="TOut">The output type.</typeparam>
     public class FuncValueConverter<TIn, TOut> : IValueConverter
     {
-        private Func<TIn, TOut> _convert;
+        private readonly Func<TIn, TOut> _convert;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="FuncValueConverter{TIn, TOut}"/> class.

+ 1 - 1
src/Markup/Perspex.Markup/StringConverters.cs

@@ -16,7 +16,7 @@ namespace Perspex.Markup
         /// A value converter that returns true if the input string is null or an empty string.
         /// </summary>
         public static readonly IValueConverter NullOrEmpty =
-            new FuncValueConverter<string, bool>(x => string.IsNullOrEmpty(x));
+            new FuncValueConverter<string, bool>(string.IsNullOrEmpty);
 
         /// <summary>
         /// A value converter that returns true if the input string is not null or empty.

+ 1 - 6
src/Perspex.Animation/Animatable.cs

@@ -25,12 +25,7 @@ namespace Perspex.Animation
         {
             get
             {
-                if (_propertyTransitions == null)
-                {
-                    _propertyTransitions = new PropertyTransitions();
-                }
-
-                return _propertyTransitions;
+                return _propertyTransitions ?? (_propertyTransitions = new PropertyTransitions());
             }
 
             set

+ 2 - 3
src/Perspex.Animation/LinearEasing.cs

@@ -27,9 +27,8 @@ namespace Perspex.Animation
             }
             else
             {
-                throw new NotSupportedException(string.Format(
-                    "Don't know how to create a LinearEasing for type '{0}'.",
-                    typeof(T).FullName));
+                throw new NotSupportedException(
+                    $"Don't know how to create a LinearEasing for type '{typeof(T).FullName}'.");
             }
         }
     }

+ 2 - 14
src/Perspex.Application/Application.cs

@@ -87,20 +87,8 @@ namespace Perspex
         /// </value>
         public DataTemplates DataTemplates
         {
-            get
-            {
-                if (_dataTemplates == null)
-                {
-                    _dataTemplates = new DataTemplates();
-                }
-
-                return _dataTemplates;
-            }
-
-            set
-            {
-                _dataTemplates = value;
-            }
+            get { return _dataTemplates ?? (_dataTemplates = new DataTemplates()); }
+            set { _dataTemplates = value; }
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.Base/BindingDescriptor.cs

@@ -81,7 +81,7 @@ namespace Perspex
         /// <summary>
         /// Gets a description of the binding.
         /// </summary>
-        public string Description => string.Format("{0}.{1}", Source?.GetType().Name, Property.Name);
+        public string Description => $"{Source?.GetType().Name}.{Property.Name}";
 
         /// <summary>
         /// Makes a two-way binding.

+ 1 - 4
src/Perspex.Base/Collections/PerspexDictionary.cs

@@ -71,10 +71,7 @@ namespace Perspex.Collections
 
                 if (replace)
                 {
-                    if (PropertyChanged != null)
-                    {
-                        PropertyChanged(this, new PropertyChangedEventArgs($"Item[{key}]"));
-                    }
+                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs($"Item[{key}]"));
 
                     if (CollectionChanged != null)
                     {

+ 4 - 12
src/Perspex.Base/Collections/PerspexList.cs

@@ -437,10 +437,7 @@ namespace Perspex.Collections
         /// </summary>
         private void NotifyCountChanged()
         {
-            if (PropertyChanged != null)
-            {
-                PropertyChanged(this, new PropertyChangedEventArgs("Count"));
-            }
+            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));
         }
 
         /// <summary>
@@ -469,14 +466,9 @@ namespace Perspex.Collections
             {
                 NotifyCollectionChangedEventArgs e;
 
-                if (ResetBehavior == ResetBehavior.Reset)
-                {
-                    e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
-                }
-                else
-                {
-                    e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, t, 0);
-                }
+                e = ResetBehavior == ResetBehavior.Reset ? 
+                    new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset) : 
+                    new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, t, 0);
 
                 CollectionChanged(this, e);
             }

+ 2 - 2
src/Perspex.Base/Metadata/XmlnsDefinitionAttribute.cs

@@ -25,11 +25,11 @@ namespace Perspex.Metadata
         /// <summary>
         /// Gets or sets the URL of the XML namespace.
         /// </summary>
-        public string XmlNamespace { get; set; }
+        public string XmlNamespace { get; }
 
         /// <summary>
         /// Gets or sets the CLR namespace.
         /// </summary>
-        public string ClrNamespace { get; set; }
+        public string ClrNamespace { get; }
     }
 }

+ 1 - 1
src/Perspex.Base/PerspexLocator.cs

@@ -36,7 +36,7 @@ namespace Perspex
 
         public class RegistrationHelper<TService>
         {
-            private PerspexLocator _locator;
+            private readonly PerspexLocator _locator;
 
             public RegistrationHelper(PerspexLocator locator)
             {

+ 4 - 13
src/Perspex.Base/PerspexObject.cs

@@ -694,20 +694,14 @@ namespace Perspex
                 newValue,
                 priority);
 
-            if (property.Notifying != null)
-            {
-                property.Notifying(this, true);
-            }
+            property.Notifying?.Invoke(this, true);
 
             try
             {
                 OnPropertyChanged(e);
                 property.NotifyChanged(e);
 
-                if (PropertyChanged != null)
-                {
-                    PropertyChanged(this, e);
-                }
+                PropertyChanged?.Invoke(this, e);
 
                 if (_inpcChanged != null)
                 {
@@ -717,10 +711,7 @@ namespace Perspex
             }
             finally
             {
-                if (property.Notifying != null)
-                {
-                    property.Notifying(this, false);
-                }
+                property.Notifying?.Invoke(this, false);
             }
         }
 
@@ -866,7 +857,7 @@ namespace Perspex
         /// <returns>The description.</returns>
         private string GetDescription(PerspexProperty property)
         {
-            return string.Format("{0}.{1}", GetType().Name, property.Name);
+            return $"{GetType().Name}.{property.Name}";
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.Base/PerspexProperty.cs

@@ -538,7 +538,7 @@ namespace Perspex
         public override bool Equals(object obj)
         {
             var p = obj as PerspexProperty;
-            return p != null ? Equals(p) : false;
+            return p != null && Equals(p);
         }
 
         /// <inheritdoc/>

+ 1 - 4
src/Perspex.Base/PriorityBindingEntry.cs

@@ -99,10 +99,7 @@ namespace Perspex
         /// </summary>
         public void Dispose()
         {
-            if (_subscription != null)
-            {
-                _subscription.Dispose();
-            }
+            _subscription?.Dispose();
         }
     }
 }

+ 1 - 4
src/Perspex.Base/Reactive/PerspexObservable.cs

@@ -22,10 +22,7 @@ namespace Perspex.Reactive
         /// <param name="description">The description of the observable.</param>
         public PerspexObservable(Func<IObserver<T>, IDisposable> subscribe, string description)
         {
-            if (subscribe == null)
-            {
-                throw new ArgumentNullException("subscribe");
-            }
+            Contract.Requires<ArgumentNullException>(subscribe != null);            
 
             _subscribe = subscribe;
             Description = description;

+ 2 - 6
src/Perspex.Base/Threading/DispatcherTimer.cs

@@ -131,9 +131,8 @@ namespace Perspex.Threading
         /// <returns>An <see cref="IDisposable"/> used to cancel the timer.</returns>
         public static IDisposable Run(Func<bool> action, TimeSpan interval, DispatcherPriority priority = DispatcherPriority.Normal)
         {
-            var timer = new DispatcherTimer(priority);
+            var timer = new DispatcherTimer(priority) { Interval = interval };
 
-            timer.Interval = interval;
             timer.Tick += (s, e) =>
             {
                 if (!action())
@@ -187,10 +186,7 @@ namespace Perspex.Threading
         /// </summary>
         private void RaiseTick()
         {
-            if (Tick != null)
-            {
-                Tick(this, EventArgs.Empty);
-            }
+            Tick?.Invoke(this, EventArgs.Empty);
         }
     }
 }

+ 2 - 2
src/Perspex.Base/Threading/SingleThreadDispatcher.cs

@@ -12,8 +12,8 @@ namespace Perspex.Threading
     {
         class ThreadingInterface : IPlatformThreadingInterface
         {
-            private AutoResetEvent _evnt = new AutoResetEvent(false);
-            private JobRunner _timerJobRunner;
+            private readonly AutoResetEvent _evnt = new AutoResetEvent(false);
+            private readonly JobRunner _timerJobRunner;
 
             public ThreadingInterface()
             {

+ 1 - 4
src/Perspex.Controls/Button.cs

@@ -207,10 +207,7 @@ namespace Perspex.Controls
         /// <param name="e">The event args.</param>
         protected virtual void OnClick(RoutedEventArgs e)
         {
-            if (Command != null)
-            {
-                Command.Execute(CommandParameter);
-            }
+            Command?.Execute(CommandParameter);
         }
 
         /// <inheritdoc/>

+ 5 - 29
src/Perspex.Controls/Control.cs

@@ -156,20 +156,8 @@ namespace Perspex.Controls
         /// </remarks>
         public DataTemplates DataTemplates
         {
-            get
-            {
-                if (_dataTemplates == null)
-                {
-                    _dataTemplates = new DataTemplates();
-                }
-
-                return _dataTemplates;
-            }
-
-            set
-            {
-                _dataTemplates = value;
-            }
+            get { return _dataTemplates ?? (_dataTemplates = new DataTemplates()); }
+            set { _dataTemplates = value; }
         }
 
         /// <summary>
@@ -182,20 +170,8 @@ namespace Perspex.Controls
         /// </remarks>
         public Styles Styles
         {
-            get
-            {
-                if (_styles == null)
-                {
-                    _styles = new Styles();
-                }
-
-                return _styles;
-            }
-
-            set
-            {
-                _styles = value;
-            }
+            get { return _styles ?? (_styles = new Styles()); }
+            set { _styles = value; }
         }
 
         /// <summary>
@@ -321,7 +297,7 @@ namespace Perspex.Controls
                 throw new ArgumentException("Cannot supply an empty className.");
             }
 
-            Observable.Merge(property.Changed, property.Initialized)
+            property.Changed.Merge(property.Initialized)
                 .Subscribe(e =>
                 {
                     if (selector((T)e.NewValue))

+ 1 - 6
src/Perspex.Controls/Decorator.cs

@@ -71,12 +71,7 @@ namespace Perspex.Controls
         protected override Size ArrangeOverride(Size finalSize)
         {
             Control content = Child;
-
-            if (content != null)
-            {
-                content.Arrange(new Rect(finalSize).Deflate(Padding));
-            }
-
+            content?.Arrange(new Rect(finalSize).Deflate(Padding));
             return finalSize;
         }
 

+ 4 - 7
src/Perspex.Controls/DockPanel.cs

@@ -251,18 +251,15 @@
 
     public struct Alignments
     {
-        private readonly Alignment _horizontal;
-        private readonly Alignment _vertical;
-
         public Alignments(Alignment horizontal, Alignment vertical)
         {
-            _horizontal = horizontal;
-            _vertical = vertical;
+            Horizontal = horizontal;
+            Vertical = vertical;
         }
 
-        public Alignment Horizontal => _horizontal;
+        public Alignment Horizontal { get; }
 
-        public Alignment Vertical => _vertical;
+        public Alignment Vertical { get; }
     }
 
     public static class CoordinateMixin

+ 5 - 16
src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs

@@ -14,8 +14,8 @@ namespace Perspex.Controls.Generators
     public class TreeItemContainerGenerator<T> : ItemContainerGenerator<T>, ITreeItemContainerGenerator
         where T : class, IControl, new()
     {
-        private Dictionary<object, T> _itemToContainer;
-        private Dictionary<IControl, object> _containerToItem;
+        private readonly Dictionary<object, T> _itemToContainer;
+        private readonly Dictionary<IControl, object> _containerToItem;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="TreeItemContainerGenerator{T}"/> class.
@@ -182,20 +182,9 @@ namespace Perspex.Controls.Generators
         /// <returns>The template.</returns>
         private ITreeDataTemplate GetTreeDataTemplate(object item)
         {
-            IDataTemplate template = Owner.FindDataTemplate(item);
-
-            if (template == null)
-            {
-                template = FuncDataTemplate.Default;
-            }
-
-            var treeTemplate = template as ITreeDataTemplate;
-
-            if (treeTemplate == null)
-            {
-                treeTemplate = new FuncTreeDataTemplate(typeof(object), template.Build, x => null);
-            }
-
+            var template = Owner.FindDataTemplate(item) ?? FuncDataTemplate.Default;
+            var treeTemplate = template as ITreeDataTemplate ??
+                new FuncTreeDataTemplate(typeof(object), template.Build, x => null);
             return treeTemplate;
         }
     }

+ 3 - 3
src/Perspex.Controls/HotkeyManager.cs

@@ -12,7 +12,7 @@ namespace Perspex.Controls
 {
     public class HotKeyManager
     {
-        public static PerspexProperty<KeyGesture> HotKeyProperty
+        public static readonly PerspexProperty<KeyGesture> HotKeyProperty
             = PerspexProperty.RegisterAttached<Control, KeyGesture>("HotKey", typeof (HotKeyManager));
 
         class HotkeyCommandWrapper : ICommand
@@ -22,7 +22,7 @@ namespace Perspex.Controls
                 Control = control;
             }
 
-            public IControl Control;
+            public readonly IControl Control;
 
             private ICommand GetCommand() => Control.GetValue(Button.CommandProperty);
 
@@ -42,7 +42,7 @@ namespace Perspex.Controls
             private IDisposable _parentSub;
             private IDisposable _hotkeySub;
             private KeyGesture _hotkey;
-            private HotkeyCommandWrapper _wrapper;
+            private readonly HotkeyCommandWrapper _wrapper;
             private KeyBinding _binding;
 
             public Manager(IControl control)

+ 1 - 4
src/Perspex.Controls/ListBox.cs

@@ -29,10 +29,7 @@ namespace Perspex.Controls
             SelectingItemsControl.SelectionModeProperty;
 
         /// <inheritdoc/>
-        public new IList SelectedItems
-        {
-            get { return base.SelectedItems; }
-        }
+        public new IList SelectedItems => base.SelectedItems;
 
         /// <inheritdoc/>
         public new SelectionMode SelectionMode

+ 1 - 1
src/Perspex.Controls/Menu.cs

@@ -116,7 +116,7 @@ namespace Perspex.Controls
 
             var inputRoot = e.Root as IInputRoot;
 
-            if (inputRoot != null && inputRoot.AccessKeyHandler != null)
+            if (inputRoot?.AccessKeyHandler != null)
             {
                 inputRoot.AccessKeyHandler.MainMenu = this;
             }

+ 2 - 9
src/Perspex.Controls/MenuItem.cs

@@ -209,10 +209,7 @@ namespace Perspex.Controls
         /// <param name="e">The click event args.</param>
         protected virtual void OnClick(RoutedEventArgs e)
         {
-            if (Command != null)
-            {
-                Command.Execute(CommandParameter);
-            }
+            Command?.Execute(CommandParameter);
         }
 
         /// <summary>
@@ -483,11 +480,7 @@ namespace Perspex.Controls
             if (selected != -1)
             {
                 var container = ItemContainerGenerator.ContainerFromIndex(selected);
-
-                if (container != null)
-                {
-                    container.Focus();
-                }
+                container?.Focus();
             }
         }
 

+ 2 - 6
src/Perspex.Controls/MenuItemAccessKeyHandler.cs

@@ -93,13 +93,9 @@ namespace Perspex.Controls
             {
                 var text = e.Text.ToUpper();
                 var focus = _registered
-                    .Where(x => x.Item1 == text && x.Item2.IsEffectivelyVisible)
-                    .FirstOrDefault()?.Item2;
+                    .FirstOrDefault(x => x.Item1 == text && x.Item2.IsEffectivelyVisible)?.Item2;
 
-                if (focus != null)
-                {
-                    focus.RaiseEvent(new RoutedEventArgs(AccessKeyHandler.AccessKeyPressedEvent));
-                }
+                focus?.RaiseEvent(new RoutedEventArgs(AccessKeyHandler.AccessKeyPressedEvent));
 
                 e.Handled = true;
             }

+ 1 - 5
src/Perspex.Controls/Primitives/AdornerLayer.cs

@@ -74,11 +74,7 @@ namespace Perspex.Controls.Primitives
             var adorner = (Visual)e.Sender;
             var adorned = (Visual)e.NewValue;
             var layer = adorner.GetVisualParent<AdornerLayer>();
-
-            if (layer != null)
-            {
-                layer.UpdateAdornedElement(adorner, adorned);
-            }
+            layer?.UpdateAdornedElement(adorner, adorned);
         }
 
         private void ChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)

+ 3 - 5
src/Perspex.Controls/Primitives/Popup.cs

@@ -250,10 +250,7 @@ namespace Perspex.Controls.Primitives
         {
             LogicalChildren.Clear();
 
-            if (e.OldValue != null)
-            {
-                ((ISetLogicalParent)e.OldValue).SetParent(null);
-            }
+            ((ISetLogicalParent)e.OldValue)?.SetParent(null);
 
             if (e.NewValue != null)
             {
@@ -269,10 +266,11 @@ namespace Perspex.Controls.Primitives
         private Point GetPosition()
         {
             var target = PlacementTarget ?? this.GetVisualParent<Control>();
-            Point point;
 
             if (target != null)
             {
+                Point point;
+
                 switch (PlacementMode)
                 {
                     case PlacementMode.Bottom:

+ 2 - 7
src/Perspex.Controls/Primitives/PopupRoot.cs

@@ -106,13 +106,8 @@ namespace Perspex.Controls.Primitives
                     _presenterSubscription = null;
                 }
 
-                var presenter = Presenter;
-
-                if (presenter != null)
-                {
-                    presenter.GetObservable(ContentPresenter.ChildProperty)
-                        .Subscribe(SetTemplatedParentAndApplyChildTemplates);
-                }
+                Presenter?.GetObservable(ContentPresenter.ChildProperty)
+                    .Subscribe(SetTemplatedParentAndApplyChildTemplates);
             }
         }
 

+ 1 - 1
src/Perspex.Controls/Primitives/SelectingItemsControl.cs

@@ -317,7 +317,7 @@ namespace Perspex.Controls.Primitives
                     var mode = SelectionMode;
                     var toggle = toggleModifier || (mode & SelectionMode.Toggle) != 0;
                     var multi = (mode & SelectionMode.Multiple) != 0;
-                    var range = multi && SelectedIndex != -1 ? rangeModifier : false;
+                    var range = multi && SelectedIndex != -1 && rangeModifier;
 
                     if (!toggle && !range)
                     {

+ 1 - 4
src/Perspex.Controls/TabControl.cs

@@ -48,10 +48,7 @@ namespace Perspex.Controls
         /// <summary>
         /// Gets an <see cref="IMemberSelector"/> that selects the content of a <see cref="TabItem"/>.
         /// </summary>
-        public IMemberSelector ContentSelector
-        {
-            get { return s_contentSelector; }
-        }
+        public IMemberSelector ContentSelector => s_contentSelector;
 
         /// <summary>
         /// Gets the <see cref="SelectingItemsControl.SelectedItem"/> as a <see cref="TabItem"/>.

+ 1 - 3
src/Perspex.Controls/Templates/FuncDataTemplate.cs

@@ -73,9 +73,7 @@ namespace Perspex.Controls.Templates
         /// </returns>
         private static bool IsInstance(object o, Type t)
         {
-            return (o != null) ?
-                t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()) :
-                false;
+            return (o != null) && t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo());
         }
     }
 }

+ 1 - 1
src/Perspex.Controls/Templates/FuncDataTemplate`1.cs

@@ -43,7 +43,7 @@ namespace Perspex.Controls.Templates
         /// <returns>The weakly typed function.</returns>
         private static Func<object, bool> CastMatch(Func<T, bool> f)
         {
-            return o => (o is T) ? f((T)o) : false;
+            return o => (o is T) && f((T)o);
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.Controls/Templates/FuncMemberSelector.cs

@@ -10,7 +10,7 @@ namespace Perspex.Controls.Templates
     /// </summary>
     public class FuncMemberSelector<TObject, TMember> : IMemberSelector
     {
-        private Func<TObject, TMember> _selector;
+        private readonly Func<TObject, TMember> _selector;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="FuncMemberSelector{TObject, TMember}"/>

+ 1 - 3
src/Perspex.Controls/Templates/FuncTreeDataTemplate.cs

@@ -137,9 +137,7 @@ namespace Perspex.Controls.Templates
         /// </returns>
         private static bool IsInstance(object o, Type t)
         {
-            return (o != null) ?
-                t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()) :
-                false;
+            return (o != null) && t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo());
         }
     }
 }

+ 1 - 1
src/Perspex.Controls/Templates/FuncTreeDataTemplate`1.cs

@@ -117,7 +117,7 @@ namespace Perspex.Controls.Templates
         /// <returns>The untyped function.</returns>
         private static Func<object, bool> CastMatch(Func<T, bool> f)
         {
-            return o => (o is T) ? f((T)o) : false;
+            return o => (o is T) && f((T)o);
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.Controls/TextBox.cs

@@ -360,7 +360,7 @@ namespace Perspex.Controls
         private static int ValidateCaretIndex(PerspexObject o, int value)
         {
             var text = o.GetValue(TextProperty);
-            var length = (text != null) ? text.Length : 0;
+            var length = text?.Length ?? 0;
             return Math.Max(0, Math.Min(length, value));
         }
 

+ 1 - 1
src/Perspex.Controls/ToolTip.cs

@@ -115,7 +115,7 @@ namespace Perspex.Controls
                 }
 
                 var cp = MouseDevice.Instance?.GetPosition(control);
-                var position = control.PointToScreen(cp.HasValue ? cp.Value : new Point(0, 0)) + new Vector(0, 22);
+                var position = control.PointToScreen(cp ?? new Point(0, 0)) + new Vector(0, 22);
 
                 ((ToolTip)s_popup.Content).Content = GetTip(control);
                 s_popup.SetPosition(position);

+ 9 - 29
src/Perspex.Controls/TopLevel.cs

@@ -102,7 +102,7 @@ namespace Perspex.Controls
             PlatformImpl.Input = HandleInput;
             PlatformImpl.Resized = HandleResized;
 
-            Size clientSize = ClientSize = PlatformImpl.ClientSize;
+            var clientSize = ClientSize = PlatformImpl.ClientSize;
 
             if (LayoutManager != null)
             {
@@ -111,16 +111,8 @@ namespace Perspex.Controls
                 LayoutManager.LayoutCompleted.Subscribe(_ => HandleLayoutCompleted());
             }
 
-            if (_keyboardNavigationHandler != null)
-            {
-                _keyboardNavigationHandler.SetOwner(this);
-            }
-
-            if (_accessKeyHandler != null)
-            {
-                _accessKeyHandler.SetOwner(this);
-            }
-
+            _keyboardNavigationHandler?.SetOwner(this);
+            _accessKeyHandler?.SetOwner(this);
             styler?.ApplyStyles(this);
 
             GetObservable(ClientSizeProperty).Skip(1).Subscribe(x => PlatformImpl.ClientSize = x);
@@ -306,12 +298,9 @@ namespace Perspex.Controls
         {
             var result = resolver.GetService<T>();
 
-            if (result == null)
-            {
-                System.Diagnostics.Debug.WriteLineIf(
-                    result == null,
-                    $"Could not create {typeof(T).Name} : maybe Application.RegisterServices() wasn't called?");
-            }
+            System.Diagnostics.Debug.WriteLineIf(
+                result == null,
+                $"Could not create {typeof(T).Name} : maybe Application.RegisterServices() wasn't called?");
 
             return result;
         }
@@ -321,10 +310,7 @@ namespace Perspex.Controls
         /// </summary>
         private void HandleActivated()
         {
-            if (Activated != null)
-            {
-                Activated(this, EventArgs.Empty);
-            }
+            Activated?.Invoke(this, EventArgs.Empty);
 
             var scope = this as IFocusScope;
 
@@ -341,10 +327,7 @@ namespace Perspex.Controls
         /// </summary>
         private void HandleClosed()
         {
-            if (Closed != null)
-            {
-                Closed(this, EventArgs.Empty);
-            }
+            Closed?.Invoke(this, EventArgs.Empty);
         }
 
         /// <summary>
@@ -354,10 +337,7 @@ namespace Perspex.Controls
         {
             IsActive = false;
 
-            if (Deactivated != null)
-            {
-                Deactivated(this, EventArgs.Empty);
-            }
+            Deactivated?.Invoke(this, EventArgs.Empty);
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.Controls/UserControl.cs

@@ -8,7 +8,7 @@ namespace Perspex.Controls
 {
     public class UserControl : ContentControl, IStyleable, INameScope
     {
-        private NameScope _nameScope = new NameScope();
+        private readonly NameScope _nameScope = new NameScope();
 
         /// <inheritdoc/>
         event EventHandler<NameScopeEventArgs> INameScope.Registered

+ 2 - 2
src/Perspex.Controls/Window.cs

@@ -55,9 +55,9 @@ namespace Perspex.Controls
         public static readonly PerspexProperty<string> TitleProperty =
             PerspexProperty.Register<Window, string>(nameof(Title), "Window");
 
-        private NameScope _nameScope = new NameScope();
+        private readonly NameScope _nameScope = new NameScope();
         private object _dialogResult;
-        private Size _maxPlatformClientSize;
+        private readonly Size _maxPlatformClientSize;
 
         /// <summary>
         /// Initializes static members of the <see cref="Window"/> class.

+ 1 - 12
src/Perspex.Diagnostics/LogManager.cs

@@ -11,18 +11,7 @@ namespace Perspex.Diagnostics
     {
         private static LogManager s_instance;
 
-        public static LogManager Instance
-        {
-            get
-            {
-                if (s_instance == null)
-                {
-                    s_instance = new LogManager();
-                }
-
-                return s_instance;
-            }
-        }
+        public static LogManager Instance => s_instance ?? (s_instance = new LogManager());
 
         public ILogger Logger
         {

+ 1 - 1
src/Perspex.Diagnostics/ViewModels/PropertyDetails.cs

@@ -17,7 +17,7 @@ namespace Perspex.Diagnostics.ViewModels
         public PropertyDetails(PerspexObject o, PerspexProperty property)
         {
             Name = property.IsAttached ?
-                string.Format("[{0}.{1}]", property.OwnerType.Name, property.Name) :
+                $"[{property.OwnerType.Name}.{property.Name}]" :
                 property.Name;
             IsAttached = property.IsAttached;
 

+ 1 - 1
src/Perspex.Diagnostics/ViewModels/VisualTreeNode.cs

@@ -14,7 +14,7 @@ namespace Perspex.Diagnostics.ViewModels
         {
             var host = visual as IVisualTreeHost;
 
-            if (host == null || host.Root == null)
+            if (host?.Root == null)
             {
                 Children = visual.VisualChildren.CreateDerivedCollection(x => new VisualTreeNode(x));
             }

+ 1 - 1
src/Perspex.HtmlRenderer/Adapters/GraphicsAdapter.cs

@@ -42,7 +42,7 @@ namespace TheArtOfDev.HtmlRenderer.Perspex.Adapters
         #endregion
 
 
-        private Stack<IDisposable> _clipStack = new Stack<IDisposable>();
+        private readonly Stack<IDisposable> _clipStack = new Stack<IDisposable>();
 
 
         /// <summary>

+ 1 - 1
src/Perspex.Input/FocusManager.cs

@@ -182,7 +182,7 @@ namespace Perspex.Input
                 {
                     element = element.GetSelfAndVisualAncestors()
                         .OfType<IInputElement>()
-                        .FirstOrDefault(x => CanFocus(x));
+                        .FirstOrDefault(CanFocus);
                 }
 
                 if (element != null)

+ 2 - 2
src/Perspex.Input/KeyBinding.cs

@@ -9,7 +9,7 @@ namespace Perspex.Input
 {
     public class KeyBinding : PerspexObject
     {
-        public static PerspexProperty<ICommand> CommandProperty =
+        public static readonly PerspexProperty<ICommand> CommandProperty =
             PerspexProperty.Register<KeyBinding, ICommand>("Command");
 
         public ICommand Command
@@ -18,7 +18,7 @@ namespace Perspex.Input
             set { SetValue(CommandProperty, value); }
         }
 
-        public static PerspexProperty<KeyGesture> GestureProperty =
+        public static readonly PerspexProperty<KeyGesture> GestureProperty =
             PerspexProperty.Register<KeyBinding, KeyGesture>("Gesture");
 
         public KeyGesture Gesture

+ 1 - 1
src/Perspex.Input/KeyGesture.cs

@@ -45,7 +45,7 @@ namespace Perspex.Input
         public InputModifiers Modifiers { get; set; }
 
         
-        static Dictionary<string, Key> KeySynonims = new Dictionary<string, Key>
+        static readonly Dictionary<string, Key> KeySynonims = new Dictionary<string, Key>
         {
             {"+", Key.OemPlus },
             {"-", Key.OemMinus},

+ 8 - 14
src/Perspex.Input/KeyboardDevice.cs

@@ -54,26 +54,20 @@ namespace Perspex.Input
             {
                 var interactive = FocusedElement as IInteractive;
 
-                if (interactive != null)
+                interactive?.RaiseEvent(new RoutedEventArgs
                 {
-                    interactive.RaiseEvent(new RoutedEventArgs
-                    {
-                        RoutedEvent = InputElement.LostFocusEvent,
-                    });
-                }
+                    RoutedEvent = InputElement.LostFocusEvent,
+                });
 
                 FocusedElement = element;
                 interactive = element as IInteractive;
 
-                if (interactive != null)
+                interactive?.RaiseEvent(new GotFocusEventArgs
                 {
-                    interactive.RaiseEvent(new GotFocusEventArgs
-                    {
-                        RoutedEvent = InputElement.GotFocusEvent,
-                        NavigationMethod = method,
-                        InputModifiers = modifiers,
-                    });
-                }
+                    RoutedEvent = InputElement.GotFocusEvent,
+                    NavigationMethod = method,
+                    InputModifiers = modifiers,
+                });
             }
         }
 

+ 14 - 20
src/Perspex.Input/MouseDevice.cs

@@ -178,17 +178,14 @@ namespace Perspex.Input
             {
                 IInteractive source = GetSource(hit);
 
-                if (source != null)
+                source?.RaiseEvent(new PointerReleasedEventArgs
                 {
-                    source.RaiseEvent(new PointerReleasedEventArgs
-                    {
-                        Device = this,
-                        RoutedEvent = InputElement.PointerReleasedEvent,
-                        Source = source,
-                        MouseButton = button,
-                        InputModifiers = inputModifiers
-                    });
-                }
+                    Device = this,
+                    RoutedEvent = InputElement.PointerReleasedEvent,
+                    Source = source,
+                    MouseButton = button,
+                    InputModifiers = inputModifiers
+                });
             }
         }
 
@@ -200,17 +197,14 @@ namespace Perspex.Input
             {
                 IInteractive source = GetSource(hit);
 
-                if (source != null)
+                source?.RaiseEvent(new PointerWheelEventArgs
                 {
-                    source.RaiseEvent(new PointerWheelEventArgs
-                    {
-                        Device = this,
-                        RoutedEvent = InputElement.PointerWheelChangedEvent,
-                        Source = source,
-                        Delta = delta,
-                        InputModifiers = inputModifiers
-                    });
-                }
+                    Device = this,
+                    RoutedEvent = InputElement.PointerWheelChangedEvent,
+                    Source = source,
+                    Delta = delta,
+                    InputModifiers = inputModifiers
+                });
             }
         }
 

+ 3 - 10
src/Perspex.Input/Navigation/DirectionalNavigation.cs

@@ -196,16 +196,9 @@ namespace Perspex.Input.Navigation
                 var siblings = parent.GetVisualChildren()
                     .OfType<IInputElement>()
                     .Where(FocusExtensions.CanFocusDescendents);
-                IInputElement sibling;
-
-                if (isForward)
-                {
-                    sibling = siblings.SkipWhile(x => x != container).Skip(1).FirstOrDefault();
-                }
-                else
-                {
-                    sibling = siblings.TakeWhile(x => x != container).LastOrDefault();
-                }
+                var sibling = isForward ? 
+                    siblings.SkipWhile(x => x != container).Skip(1).FirstOrDefault() : 
+                    siblings.TakeWhile(x => x != container).LastOrDefault();
 
                 if (sibling != null)
                 {

+ 3 - 10
src/Perspex.Input/Navigation/TabNavigation.cs

@@ -204,16 +204,9 @@ namespace Perspex.Input.Navigation
                 var siblings = parent.GetVisualChildren()
                     .OfType<IInputElement>()
                     .Where(FocusExtensions.CanFocusDescendents);
-                IInputElement sibling;
-
-                if (direction == FocusNavigationDirection.Next)
-                {
-                    sibling = siblings.SkipWhile(x => x != container).Skip(1).FirstOrDefault();
-                }
-                else
-                {
-                    sibling = siblings.TakeWhile(x => x != container).LastOrDefault();
-                }
+                var sibling = direction == FocusNavigationDirection.Next ? 
+                    siblings.SkipWhile(x => x != container).Skip(1).FirstOrDefault() : 
+                    siblings.TakeWhile(x => x != container).LastOrDefault();
 
                 if (sibling != null)
                 {

+ 4 - 20
src/Perspex.Layout/Layoutable.cs

@@ -386,11 +386,7 @@ namespace Perspex.Layout
             else
             {
                 var root = GetLayoutRoot();
-
-                if (root != null && root.Item1.LayoutManager != null)
-                {
-                    root.Item1.LayoutManager.InvalidateMeasure(this, root.Item2);
-                }
+                root?.Item1.LayoutManager?.InvalidateMeasure(this, root.Item2);
             }
         }
 
@@ -408,11 +404,7 @@ namespace Perspex.Layout
 
             IsArrangeValid = false;
             _previousArrange = null;
-
-            if (root != null && root.Item1.LayoutManager != null)
-            {
-                root.Item1.LayoutManager.InvalidateArrange(this, root.Item2);
-            }
+            root?.Item1.LayoutManager?.InvalidateArrange(this, root.Item2);
         }
 
         /// <summary>
@@ -606,11 +598,7 @@ namespace Perspex.Layout
         private static void AffectsMeasureInvalidate(PerspexPropertyChangedEventArgs e)
         {
             ILayoutable control = e.Sender as ILayoutable;
-
-            if (control != null)
-            {
-                control.InvalidateMeasure();
-            }
+            control?.InvalidateMeasure();
         }
 
         /// <summary>
@@ -620,11 +608,7 @@ namespace Perspex.Layout
         private static void AffectsArrangeInvalidate(PerspexPropertyChangedEventArgs e)
         {
             ILayoutable control = e.Sender as ILayoutable;
-
-            if (control != null)
-            {
-                control.InvalidateArrange();
-            }
+            control?.InvalidateArrange();
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.SceneGraph/Media/Color.cs

@@ -134,7 +134,7 @@ namespace Perspex.Media
         public override string ToString()
         {
             uint rgb = ((uint)A << 24) | ((uint)R << 16) | ((uint)G << 8) | (uint)B;
-            return string.Format("#{0:x8}", rgb);
+            return $"#{rgb:x8}";
         }
 
         /// <summary>

+ 1 - 9
src/Perspex.SceneGraph/Media/DashStyle.cs

@@ -28,15 +28,7 @@
         private static DashStyle dot;
         public static DashStyle Dot
         {
-            get
-            {
-                if (dot == null)
-                {
-                    dot = new DashStyle(new double[] { 0, 2 }, 0);
-                }
-
-                return dot;
-            }
+            get { return dot ?? (dot = new DashStyle(new double[] {0, 2}, 0)); }
         }
 
         private static DashStyle dashDot;

+ 2 - 2
src/Perspex.SceneGraph/Media/DrawingContext.cs

@@ -26,8 +26,8 @@ namespace Perspex.Media
 
         struct TransformContainer
         {
-            public Matrix LocalTransform;
-            public Matrix ContainerTransform;
+            public readonly Matrix LocalTransform;
+            public readonly Matrix ContainerTransform;
 
             public TransformContainer(Matrix localTransform, Matrix containerTransform)
             {

+ 3 - 8
src/Perspex.SceneGraph/Media/PathMarkupParser.cs

@@ -98,14 +98,9 @@ namespace Perspex.Media
                                 _context.EndFigure(false);
                             }
 
-                            if (command == Command.Move)
-                            {
-                                point = ReadPoint(reader);
-                            }
-                            else
-                            {
-                                point = ReadRelativePoint(reader, point);
-                            }
+                            point = command == Command.Move ? 
+                                ReadPoint(reader) : 
+                                ReadRelativePoint(reader, point);
 
                             _context.BeginFigure(point, true);
                             openFigure = true;

+ 1 - 4
src/Perspex.SceneGraph/Media/Transform.cs

@@ -26,10 +26,7 @@ namespace Perspex.Media
         /// </summary>
         protected void RaiseChanged()
         {
-            if (Changed != null)
-            {
-                Changed(this, EventArgs.Empty);
-            }
+            Changed?.Invoke(this, EventArgs.Empty);
         }
     }
 }

+ 1 - 1
src/Perspex.SceneGraph/RelativePoint.cs

@@ -109,7 +109,7 @@ namespace Perspex
         /// <returns>True if the objects are equal, otherwise false.</returns>
         public override bool Equals(object obj)
         {
-            return (obj is RelativePoint) ? Equals((RelativePoint)obj) : false;
+            return (obj is RelativePoint) && Equals((RelativePoint)obj);
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.SceneGraph/RelativeRect.cs

@@ -116,7 +116,7 @@ namespace Perspex
         /// <returns>True if the objects are equal, otherwise false.</returns>
         public override bool Equals(object obj)
         {
-            return (obj is RelativeRect) ? Equals((RelativeRect)obj) : false;
+            return (obj is RelativeRect) && Equals((RelativeRect)obj);
         }
 
         /// <summary>

+ 1 - 1
src/Perspex.SceneGraph/Rendering/RendererBase.cs

@@ -25,7 +25,7 @@ namespace Perspex.Rendering
         static int s_fps;
         static int s_currentFrames;
         static TimeSpan s_lastMeasure;
-        static Stopwatch s_stopwatch = Stopwatch.StartNew();
+        static readonly Stopwatch s_stopwatch = Stopwatch.StartNew();
         /// <summary>
         /// Renders the specified visual.
         /// </summary>

+ 1 - 1
src/Perspex.SceneGraph/Thickness.cs

@@ -231,7 +231,7 @@ namespace Perspex
         /// <returns>The string representation of the thickness.</returns>
         public override string ToString()
         {
-            return string.Format("{0},{1},{2},{3}", _left, _top, _right, _bottom);
+            return $"{_left},{_top},{_right},{_bottom}";
         }
     }
 }

+ 1 - 5
src/Perspex.SceneGraph/Visual.cs

@@ -272,11 +272,7 @@ namespace Perspex
             IRenderRoot root = this.GetSelfAndVisualAncestors()
                 .OfType<IRenderRoot>()
                 .FirstOrDefault();
-
-            if (root != null && root.RenderQueueManager != null)
-            {
-                root.RenderQueueManager.InvalidateRender(this);
-            }
+            root?.RenderQueueManager?.InvalidateRender(this);
         }
 
         /// <summary>

+ 2 - 2
src/Perspex.SceneGraph/VisualTree/BoundsTracker.cs

@@ -44,10 +44,10 @@ namespace Perspex.VisualTree
                 boundsSubscriptions.Add(v.GetObservable(Visual.BoundsProperty));
             }
 
-            var bounds = Observable.CombineLatest(boundsSubscriptions).Select(ExtractBounds);
+            var bounds = boundsSubscriptions.CombineLatest().Select(ExtractBounds);
 
             // TODO: Track transform and clip rectangle.
-            return Observable.Select(bounds, x => new TransformedBounds((Rect)x, (Rect)new Rect(), (Matrix)Matrix.Identity));
+            return bounds.Select(x => new TransformedBounds((Rect)x, (Rect)new Rect(), (Matrix)Matrix.Identity));
         }
 
         /// <summary>

+ 1 - 5
src/Perspex.Styling/Styling/Classes.cs

@@ -147,11 +147,7 @@ namespace Perspex.Styling
 
         private void RaiseChanged(NotifyCollectionChangedEventArgs e)
         {
-            if (CollectionChanged != null)
-            {
-                CollectionChanged(this, e);
-            }
-
+            CollectionChanged?.Invoke(this, e);
             _changed.OnNext(e);
             _afterChanged.OnNext(e);
         }

+ 1 - 4
src/Perspex.Styling/Styling/Selector.cs

@@ -97,10 +97,7 @@ namespace Perspex.Styling
         /// <summary>
         /// Gets the target type of the selector, if available.
         /// </summary>
-        public Type TargetType
-        {
-            get { return _targetType ?? MovePrevious()?.TargetType; }
-        }
+        public Type TargetType => _targetType ?? MovePrevious()?.TargetType;
 
         /// <summary>
         /// Returns the previous selector if traversal is not stopped.

+ 2 - 2
src/Perspex.Styling/Styling/StyleBinding.cs

@@ -97,8 +97,8 @@ namespace Perspex.Styling
             }
             else
             {
-                return Observable
-                    .CombineLatest(_activator, Source, (x, y) => new { Active = x, Value = y })
+                return _activator
+                    .CombineLatest(Source, (x, y) => new { Active = x, Value = y })
                     .Subscribe(x => observer.OnNext(x.Active ? x.Value : PerspexProperty.UnsetValue));
             }
         }

+ 7 - 14
src/Perspex.Styling/Styling/Styler.cs

@@ -18,10 +18,7 @@ namespace Perspex.Styling
                 .FirstOrDefault();
             IGlobalStyles global = PerspexLocator.Current.GetService<IGlobalStyles>();
 
-            if (global != null)
-            {
-                global.Styles.Attach(control, null);
-            }
+            global?.Styles.Attach(control, null);
 
             if (styleContainer != null)
             {
@@ -36,17 +33,13 @@ namespace Perspex.Styling
 
             IVisual visual = container as IVisual;
 
-            if (visual != null)
+            IStyleHost parentContainer = visual?.GetVisualAncestors()
+                .OfType<IStyleHost>()
+                .FirstOrDefault();
+
+            if (parentContainer != null)
             {
-                IStyleHost parentContainer = visual
-                    .GetVisualAncestors()
-                    .OfType<IStyleHost>()
-                    .FirstOrDefault();
-
-                if (parentContainer != null)
-                {
-                    ApplyStyles(control, parentContainer);
-                }
+                ApplyStyles(control, parentContainer);
             }
 
             container.Styles.Attach(control, container);

+ 1 - 1
src/Shared/PlatformSupport/AssetLoader.cs

@@ -18,7 +18,7 @@ namespace Perspex.Shared.PlatformSupport
         private static readonly Dictionary<string, Assembly> AssemblyNameCache
             = new Dictionary<string, Assembly>();
 
-        private Assembly _defaultAssembly;
+        private readonly Assembly _defaultAssembly;
 
         public AssetLoader(Assembly assembly = null)
         {

+ 2 - 2
src/Shared/RenderHelpers/TileBrushImplHelper.cs

@@ -23,8 +23,8 @@ namespace Perspex.RenderHelpers
         private readonly Size _imageSize;
         private readonly VisualBrush _visualBrush;
         private readonly ImageBrush _imageBrush;
-        private Matrix _transform;
-        private Rect _drawRect;
+        private readonly Matrix _transform;
+        private readonly Rect _drawRect;
 
         public bool IsValid { get; }
 

+ 1 - 1
src/Skia/Perspex.Skia/DrawingContextImpl.cs

@@ -187,7 +187,7 @@ namespace Perspex.Skia
         public void PopOpacity() => _settings->Opacity = _opacityStack.Pop();
 
         private Matrix _currentTransform = Matrix.Identity;
-        private float[] _fmatrix = new float[6];
+        private readonly float[] _fmatrix = new float[6];
         public Matrix Transform
         {
             get { return _currentTransform; }

+ 3 - 3
src/Skia/Perspex.Skia/FormattedTextImpl.cs

@@ -24,9 +24,9 @@ namespace Perspex.Skia
                 return new FormattedTextImpl(handle, pShared, text);
             }
         }
-        
-        List<FormattedTextLine> _lines = new List<FormattedTextLine>();
-        List<Rect> _rects = new List<Rect>();
+
+        readonly List<FormattedTextLine> _lines = new List<FormattedTextLine>();
+        readonly List<Rect> _rects = new List<Rect>();
         Size _size;
 
         public IEnumerable<FormattedTextLine> GetLines()

+ 2 - 2
src/Skia/Perspex.Skia/NativeBrush.cs

@@ -69,7 +69,7 @@ namespace Perspex.Skia
         private readonly NativeBrushPool _pool;
         public NativeBrush* Brush;
 
-        List<IDisposable> _disposables = new List<IDisposable>();
+        readonly List<IDisposable> _disposables = new List<IDisposable>();
 
         public NativeBrushContainer(NativeBrushPool pool)
         {
@@ -96,7 +96,7 @@ namespace Perspex.Skia
     class NativeBrushPool
     {
         public static NativeBrushPool Instance { get; } = new NativeBrushPool();
-        Stack<NativeBrushContainer> _pool = new Stack<NativeBrushContainer>();
+        readonly Stack<NativeBrushContainer> _pool = new Stack<NativeBrushContainer>();
 
         public void Return(NativeBrushContainer c)
         {

+ 1 - 1
src/Skia/Perspex.Skia/PerspexHandleHolder.cs

@@ -4,7 +4,7 @@ namespace Perspex.Skia
 {
     abstract class PerspexHandleHolder : IDisposable
     {
-        private IntPtr _handle;
+        private readonly IntPtr _handle;
 
         public IntPtr Handle
         {

+ 1 - 1
src/Windows/Perspex.Designer/AppHost/PerspexAppHost.cs

@@ -23,7 +23,7 @@ namespace Perspex.Designer.AppHost
         private string _lastXaml;
         private string _currentXaml;
         private bool _initSuccess;
-        private HostedAppModel _appModel;
+        private readonly HostedAppModel _appModel;
         private Control _window;
 
         public PerspexAppHost(CommChannel channel)

+ 2 - 2
src/Windows/Perspex.Designer/AppHost/WindowHost.cs

@@ -35,8 +35,8 @@ namespace Perspex.Designer.AppHost
                 BackColor = color;
         }
 
-        private Control _windowHost = new Control() {Text = "WindowWrapper"};
-        private Timer _timer = new Timer {Enabled = true, Interval = 50};
+        private readonly Control _windowHost = new Control() {Text = "WindowWrapper"};
+        private readonly Timer _timer = new Timer {Enabled = true, Interval = 50};
         private IntPtr _hWnd;
         private int _desiredWidth;
         private int _desiredHeight;

+ 3 - 3
src/Windows/Perspex.Designer/Comm/CommChannel.cs

@@ -17,9 +17,9 @@ namespace Perspex.Designer.Comm
     {
         private readonly BinaryReader _input;
         private readonly BinaryWriter _output;
-        private SynchronizationContext _dispatcher;
-        TaskCompletionSource<bool> _terminating = new TaskCompletionSource<bool>();
-        private BlockingCollection<byte[]> _outputQueue = new BlockingCollection<byte[]>();
+        private readonly SynchronizationContext _dispatcher;
+        readonly TaskCompletionSource<bool> _terminating = new TaskCompletionSource<bool>();
+        private readonly BlockingCollection<byte[]> _outputQueue = new BlockingCollection<byte[]>();
         public event Action<object> OnMessage;
         public event Action Disposed;
         public event Action<Exception> Exception;

+ 1 - 1
src/Windows/Perspex.Designer/PerspexDesigner.xaml

@@ -11,7 +11,7 @@
             <TextBox IsReadOnly="True" TextWrapping="WrapWithOverflow" x:Name="State"/>
         </ScrollViewer>
         <StackPanel x:Name="ErrorContainer">
-            <TextBlock ></TextBlock>
+            <TextBlock />
         </StackPanel>
     </Grid>
 </UserControl>

+ 1 - 1
src/Windows/Perspex.Direct2D1/Media/DrawingContext.cs

@@ -247,7 +247,7 @@ namespace Perspex.Direct2D1.Media
             _renderTarget.PopAxisAlignedClip();
         }
 
-        Stack<Layer> _layers = new Stack<Layer>();
+        readonly Stack<Layer> _layers = new Stack<Layer>();
         private readonly Stack<Layer> _layerPool = new Stack<Layer>();
         /// <summary>
         /// Pushes an opacity value.

+ 1 - 3
src/Windows/Perspex.Win32/Input/WindowsMouseDevice.cs

@@ -10,9 +10,7 @@ namespace Perspex.Win32.Input
 {
     public class WindowsMouseDevice : MouseDevice
     {
-        private static readonly WindowsMouseDevice s_instance = new WindowsMouseDevice();
-
-        public static new WindowsMouseDevice Instance => s_instance;
+        public new static WindowsMouseDevice Instance { get; } = new WindowsMouseDevice();
 
         public WindowImpl CurrentWindow
         {

+ 2 - 2
src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs

@@ -806,8 +806,8 @@ namespace Perspex.Win32.Interop
             public IntPtr lpstrInitialDir;
             public IntPtr lpstrTitle;
             public OpenFileNameFlags Flags;
-            private ushort Unused;
-            private ushort Unused2;
+            private readonly ushort Unused;
+            private readonly ushort Unused2;
             public IntPtr lpstrDefExt;
             public IntPtr lCustData;
             public IntPtr lpfnHook;

+ 3 - 14
src/Windows/Perspex.Win32/WindowImpl.cs

@@ -204,10 +204,7 @@ namespace Perspex.Win32
                     window.IsEnabled = true;
                 }
 
-                if (activated != null)
-                {
-                    activated.Activate();
-                }
+                activated?.Activate();
             });
         }
 
@@ -256,20 +253,12 @@ namespace Perspex.Win32
                         case UnmanagedMethods.WindowActivate.WA_ACTIVE:
                         case UnmanagedMethods.WindowActivate.WA_CLICKACTIVE:
                             _isActive = true;
-                            if (Activated != null)
-                            {
-                                Activated();
-                            }
-
+                            Activated?.Invoke();
                             break;
 
                         case UnmanagedMethods.WindowActivate.WA_INACTIVE:
                             _isActive = false;
-                            if (Deactivated != null)
-                            {
-                                Deactivated();
-                            }
-
+                            Deactivated?.Invoke();
                             break;
                     }
 

+ 1 - 1
tests/Perspex.Base.UnitTests/PerspexObjectTests_Direct.cs

@@ -350,7 +350,7 @@ namespace Perspex.Base.UnitTests
                 PerspexProperty.RegisterDirect<Class1, int>("Bar", o => o.Baz, (o,v) => o.Baz = v);
 
             private string _foo = "initial";
-            private string _bar = "bar";
+            private readonly string _bar = "bar";
             private int _baz = 5;
 
             public string Foo

Some files were not shown because too many files changed in this diff