泥庭

2016年11月2日

[C#読書会]日付時刻のソート

Filed under: .NET, C#, 読書会, 未分類 — yone64 @ 11:26 PM
ちょっと間が空きました。今回は4.4です。三日坊主すら難しいですね。
日付のソートのお話

(more…)

2016年10月28日

[C#読書会]コレクションの初期化構文

Filed under: .NET, C#, 読書会 — yone64 @ 1:30 AM
前回の続きです。今回は4.4。
コレクション初期化子を使おうというお話。

(more…)

2016年10月27日

[C#読書会]TryGetでtryブロック追放

Filed under: .NET, C#, 読書会 — yone64 @ 12:39 AM
久々です。
最近、C#読書会なるもので、「C#ショートコードプログラミング」を読んでいます。
ので、軽く感想とか((続くかなぁ?

(more…)

2015年7月24日

【C#6.0】ラムダ式本体によるメンバーの記述

Filed under: .NET, C# — タグ: , , — yone64 @ 1:54 PM
今日は、ラムダ式本体によるメンバーの記述です。ながい。
# 拍子抜けするほどはまりどころがないので、さらさらいくよ。

(more…)

2015年7月23日

【C#6.0】null条件演算子

Filed under: C#, VisualStudio — タグ: , , — yone64 @ 12:15 PM
さて今回は、多くの人が待ち望んでいた(?)null条件演算子ですよっと。
# 便利だけど割と難しい

(more…)

2015年7月22日

【C#6.0】nameof

Filed under: .NET, C# — タグ: , — yone64 @ 12:09 PM
シリーズものが続かないBlogですが、第2回。
今度はnameofを見ていきます。

(more…)

【C#6.0】プロパティー新機能

Filed under: .NET, C# — タグ: , — yone64 @ 12:03 AM
Visual Studio 2015が、無事(?)リリースされました。というわけで、C#6.0絡みの新機能を試してみた記録を残しておきます。
とりあえず、プロパティー周りから。
# C#6.0の新機能とか、あちこちで以前から書かれているので、特に新しい情報はないと思われ。

(more…)

2015年4月11日

[WPF]描画パフォーマンスのお話(Polylineの場合)

Filed under: C#, performance, WPF — タグ: , — yone64 @ 11:06 PM
WPFの描画速度には、いつも悩ませてもらってます。
最近、Polylineで描画している際にちょっと不思議(?)な現象に出会ったので、一応メモ程度に。

(more…)

2015年4月6日

【WPF】カスタムメッセージボックス

Filed under: C#, WPF — タグ: , , , — yone64 @ 11:56 PM
WPF標準のメッセージボックスは、何かと機能不足でカスタマイズ性が低くて困ってしまいますね。
そこで、通常のWindowをMessageBoxっぽく見せることを検討してみたいと思います。

なお、Windows7以降のみをターゲットとできる方は、Windows API Code PackのTaskDialogをお勧めします。
良記事→ http://grabacr.net/archives/tag/windows-api-code-pack
# いまさらXP対応はないよね。Windows Server 2003ももうすぐサポート切れるし…
# Embedded とか、知らない子ですし。
というわけで、誰得なエントリーです。

(more…)

2015年3月10日

【ReactiveProperty】きちんとDisposeしよう

Filed under: .NET, C#, WPF — タグ: , , , — yone64 @ 3:05 PM
ReactivePropertyが依存しているReactiveExtensionsのお話なのですが、きちんとにDisposeしないと予期しない動作の原因になります。

下記サンプル
MainWindow.xaml
<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Viewbox>
            <TextBlock Text="{Binding DateTime.Value}" />
        </Viewbox>
    </Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication3
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        private IDisposable _disposable;

        public MainWindow()
        {
            InitializeComponent();

            var vm = new MainViewModel();
            this.DataContext = vm;

            this._disposable = vm as IDisposable;
            this.Closing += (s, e) =>
            {
                if (this._disposable != null) this._disposable.Dispose();
            };
        }
    }
}
MainViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
using System.Text;
using System.Threading.Tasks;
using Reactive.Bindings;
 
namespace WpfApplication3
{
    public class MainViewModel : IDisposable
    {
        public ReactiveProperty<string> DateTime { get; private set; }
 
        public MainViewModel()
        {
            this.DateTime = 
                Observable.Interval(TimeSpan.FromMilliseconds(10), NewThreadScheduler.Default)
                          .Select(_ => System.DateTime.Now.ToString("HH:mm:ss.fff")).ToReactiveProperty();
        }
 
        void IDisposable.Dispose()
        {
            this.DateTime.Dispose();
        }
    }
}
タイマーで時間を表示するだけの簡単なサンプルですが、ReactivePropertyをDisposeしないと終了しないアプリケーションになってしまいます。
この場合は、NewThreadSchedulerによって新しいThreadが立っているので当然の結果なのですが、Rxを使うと簡単にThreadを起こせるので、神経質にDisposeしていたほうが良い気がしました。

というわけで、基底クラスとして次のようなものを用意するようにしています。
ViewModelBase.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Text;
using System.Threading.Tasks;

namespace WpfApplication3
{
    public abstract class ViewModelBase : IDisposable
    {
        protected CompositeDisposable Disposable { get; private set; }

        public ViewModelBase()
        {
            this.Disposable = new CompositeDisposable();
        }

        void IDisposable.Dispose()
        {
            this.Disposable.Dispose();
        }
    }
}
CompositeDisposableは、Rxが提供しているIDisposableをまとめるためのクラスです。
これを利用すると、MainViewModelが次のように少し簡易になります。
MainViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
using System.Text;
using System.Threading.Tasks;
using Reactive.Bindings;
 
namespace WpfApplication3
{
    public class MainViewModel : ViewModelBase
    {
        public ReactiveProperty<string> DateTime { get; private set; }
 
        public MainViewModel()
        {
            this.DateTime = 
                Observable.Interval(TimeSpan.FromMilliseconds(10), NewThreadScheduler.Default)
                          .Select(_ => System.DateTime.Now.ToString("HH:mm:ss.fff"))
                          .ToReactiveProperty()
                          .AddTo(this.Disposable); // かずきさん指摘により修正

            // this.Disposable.Add(this.DateTime);
        }
    }
}
ToReactiveProperty()とDisposable.Add()をまとめてうまく書けるといいんですけどね。↓のような、拡張メソッドを増やすのしか思いつきませんでした。
public static class ViewModelBaseEx
{
    public static ReactiveProperty<T> ToReactiveProperty<T>(this IObservable<T> souce, CompositeDisposable disposable)
    {
        var rp = souce.ToReactiveProperty();
        disposable.Add(rp);
        return rp;
    }
}
Older Posts »

WordPress.com Blog.