親子

先日、息子(小学生)の日曜参観日に行ってきました。

算数の授業で、図形の面積を求める問題について、複数の解き方があるのでクラス全員で
色々な解き方を出し合う授業でした。

授業を見ながら自分ならどう解くかを考えていると、息子もほぼ同じ方法で解いていました。

息子は嫁よりも自分に似ているが、計算の仕方まで同じとはビックリです。

10年前のソフト

保守のために自分が10年前に作成したソースコードを読んだのですが、非常に読みづらい。
.NET Frameworkは出始めのバージョン1.1です。

.NET Frameworkの機能も貧弱だったので仕方が無い所もあるものの、名前の付け方や実装の方法が.NETの作法から外れていたり古くさかったり、残念なソースコードになっていました。

10年の間に.NETも自分も成長したのだと、ポジティブに考えることにします。

C#7のタプル

C#7の新機能の話です。

言語レベルでタプルに対応するそうです。なお、System.Tupleとは関係がありません。
ざっくり言うと、メソッドの引数や戻り値、プロパティの型などに匿名型が使える様になります。

System.Tupleを使った場合も汎用の型として同様のことが行えますが、System.TupleはメンバへのアクセスがItem1やItem2のようにメンバの意味が分かる名称で無いため、可読性が悪くあまり使いたい機能では無かったです。

タプルを使用した戻り値は以下のようなコードになります。

public (int sum, int count) Tally(IEnumerable values) { … }

var t = Tally(myValues);
Console.WriteLine($”Sum: {t.sum}, count: {t.count}”);

Tallyメソッドの戻り値がsumとcountの2つになっています。
引数と同じように括弧で囲って複数記載できるようになっています。

Tallyメソッドの呼び出し側は、戻り値を変数tに代入しています。
tは、sumとcountメンバを持つ匿名メソッドのようになっています。

この機能追加によって、out引数を使用したり、戻り値専用に一時格納用クラスを定義する必要がなくなり、シンプルで可読性の高い実装になりそうです。

NT京都2015

3/22(日)に京都で行われた、ネタモノ系ものづくりの展示・交流会「NT京都2015」を見に行ってきました。
見に行ったのは今年で2回目です。

こういう技術の無駄遣いな集まりが大好きです。
内容を詳しく書きたいのですが、今週は仕事が忙しいため詳細はまた次回記載したいと思います。

C# プロパティスコープの変数

C#7の機能追加のお話です。

C#7ではプロパティのスコープ内のみで使用できる変数が定義できるようです。
これにより以下のように実装できるようになります。

■今までの実装
private string _myField;
public string MyProperty {
 get { return _myField; }
 set {
  _myField = value;
  NotifyOfPropertyChange(nameof(MyProperty));
 }
}

■C#7での実装
public string MyProperty {
 string myField;
 get { return myField; }
 set {
  myField = value;
  NotifyOfPropertyChange(nameof(MyProperty));
 }
}

今まではクラス外からは_myFieldが隠蔽できていましたが、クラス内では自由にアクセスでき、隠蔽できてませんでした。
今回の機能追加により、プロパティのGetとSetからしかアクセスできない変数が定義できるようになり、完全な隠蔽ができるようになります。
VB6のころからこの機能が欲しいと思っていたので、とてもうれしいです。

C# タブインデックス(タブオーダー)の自動設定

先週、C#ソフトのタブインデックスを久しぶりに自分で設定しました。
いつもは誰かにして貰っていたのですが、自分でするとものすごく面倒くさい。
これは人のする作業ではないと考え、自動化する方法を検討。
結果、ネットの情報を元に以下の拡張メソッドを作成しました。

public static void RefreshTabIndex(this Control ctl) {
 //子コントロールのタブインデックス更新
 foreach (Control child in ctl.Controls) {
  if (child.Controls.Count <= 0) continue;
  child.RefreshTabIndex();
 }
 //子コントロールの位置をもとにソートする
 var children = new List<Control>();
 foreach (Control child in ctl.Controls) {
  children.Add(child);
 }
 children.Sort((x, y) => {
  if (x.Top == y.Top) return x.Left.CompareTo(y.Left);
  return x.Top.CompareTo(y.Top);
 });
 //タブインデックスを設定する
 for (int i = 0; i < children.Count; i++) {
  if (children[i].TabIndex == i) continue;
  children[i].TabIndex = i;
 }
}

フォームのコンストラクタなどで、this.RefreshTabIndex()を実行すると、
コントロールの配置をもとに自動でタブインデックスが設定されます。

まだ使い始めた所なので、この方法ではうまくいかない場合があるかも知れませんが。
概ね思っている動作をしており、作業が楽になりました。

 

関数型言語拡張ライブラリ(Lang Ext)

C#用の面白そうなオープンソースライブラリが載っていたのでメモ。
InfoQの記事

このライブラリを使うとC#に関数型言語の言語拡張が行われるそうです。
自分はF#やScalaなどの関数型言語にあまり詳しくないので、どういうメリットが生まれるのか良く分かっていないのですが、このライブラリをきっかけに覚えたいと考えています。

Blend for Visual Studio 2015

次バージョンの開発ソフトVisual Studio 2015に付属するBlend(XAMLのUIデザインツール)の見た目がVSそっくりになるそうです。機能もインテリセンスやコードスニペットが追加され、VSと似た雰囲気になります。多分ベース部分の実装が共通化されたのだと思います。

しかし、まだVSと統合はされておらず残念です。コーディングとUIデザインを完全にシームレスに行えるのは、さらに次のバージョンになるのでしょうか。